Php 如何从同一类的静态方法调用非静态方法?
我正在编写代码 下面是解释我的问题的示例代码:Php 如何从同一类的静态方法调用非静态方法?,php,oop,Php,Oop,我正在编写代码 下面是解释我的问题的示例代码: class Foo { public function fun1() { echo 'non-static'; } public static function fun2() { echo "static" ; //self::fun1(); //Foo::fun1(); } } 如何从静态方法调用非静态方法? 注意:这两种功能都在
class Foo {
public function fun1() {
echo 'non-static';
}
public static function fun2() {
echo "static" ;
//self::fun1();
//Foo::fun1();
}
}
如何从静态方法调用非静态方法?
注意:这两种功能都在整个站点中使用,这是未知的。我
无法对其静态/非静态性质进行任何更改
必须在静态方法内创建新对象才能访问该类内的非静态方法:
class Foo {
public function fun1()
{
return 'non-static';
}
public static function fun2()
{
return (new self)->fun1();
}
}
echo Foo::fun2();
结果将是非静态
稍后编辑:正如我对向构造函数传递变量感兴趣一样,我将发布该类的更新版本:
class Foo {
private $foo;
private $bar;
public function __construct($foo, $bar)
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1()
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2($foo, $bar)
{
return (new self($foo, $bar))->fun1();
}
}
echo Foo::fun2('foo', 'bar');
结果将是
foo-bar
主要区别在于,您可以为类调用静态方法,而无需实例化该类的对象。
因此,在静态方法中,请尝试
Foo $objInst = new Foo();
$objInst->fun1();
但我不认为这在任何情况下都有任何意义。因为选择正确的解决方案可以解决问题。有一个有效的用例(设计模式),其中具有静态成员函数的类需要调用非静态成员函数,在此之前,该静态成员还应该使用构造函数实例化singleton 案例:
例如,我正在实现SwooleHTTP请求事件,将其作为一个具有静态成员的类提供回调。静态成员做两件事;它通过在类构造函数中进行初始化来创建类的单例对象,而静态成员所做的第二件事是调用非静态方法“run()”来处理请求(通过与Phalcon桥接)。因此,没有构造函数和非静态调用的静态类对我来说不起作用。我认为非静态方法只能由对象调用。因为它依赖于类,静态方法是独立的。是的,但在类内部,如何?我应该在同一个类的函数中创建同一个类的对象吗?请检查:问题是:-@ANNT非静态方法getCommonData()不应该静态调用。此消息是为self::和Foo::显示的,谢谢!工作很好。但是,我们是否应该在同一个类中实例化同一个类的对象,有什么规则吗?如何传递变量以供构造函数使用?我宁愿保持具有静态函数的类尽可能干净。我会把它当作一个静态类。在静态类中,你不会有构造函数,对吗?在PHP文档中是states:将类属性或方法声明为static使它们可以访问,而不需要类的实例化。如果PHP开发人员取消了在静态类中创建非静态函数的可能性,我也不会感到惊讶,也许他们还会在将来的版本中在类前面添加静态函数。只是我的猜测。我不了解php开发。@tron有一个有效的用例,其中具有静态成员/属性的类应该使用构造函数实例化singleton,而静态函数应该调用非静态函数。我正在实现SwooleHTTP请求事件,将其作为一个具有静态成员的类进行回调。静态成员做两件事;它通过在类构造函数中进行初始化来创建类的单例对象,而静态成员所做的第二件事是调用非静态方法“run()”来处理请求(通过与Phalcon桥接)。因此,没有构造函数和非静态调用的静态类对我来说不起作用。