我正在处理PHP代码。
以下是解释我的问题的示例代码:
class Foo {
public function fun1() {
echo 'non-static';
}
public static function fun2() {
echo "static" ;
//self::fun1();
//Foo::fun1();
}
}
如何从静态方法调用非静态方法?
注意:
这两个功能都在整个站点中使用,这是未知的。一世 不能对它们的静态/非静态性质做任何改变。
答案 0 :(得分:55)
您必须在静态方法中创建一个新对象,以访问该类中的非静态方法:
class Foo {
public function fun1()
{
return 'non-static';
}
public static function fun2()
{
return (new self)->fun1();
}
}
echo Foo::fun2();
结果为non-static
稍后编辑:由于看到了将变量传递给构造函数的兴趣,我将发布该类的更新版本:
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
答案 1 :(得分:3)
主要区别在于您可以为类调用静态方法,而无需实例化该类的对象。 所以,在你的静态方法中试试
Foo $objInst = new Foo();
$objInst->fun1();
但我不知道这在任何情况下都会有任何意义。
答案 2 :(得分:0)
选择正确的答案可以解决问题。有一个有效的用例(设计模式),其中具有静态成员函数的类需要调用非静态成员函数,并且此静态成员还应该使用构造函数构造函数实例化单例。
案例: 例如,我实现了Swoole HTTP Request事件,为它提供了一个带有静态成员的Class作为回调。静态成员做两件事;它通过在类构造函数中进行初始化来创建类的Singleton Object,第二个此静态成员所做的是调用非静态方法“ run()”来处理请求(通过与Phalcon桥接)。因此,没有构造函数和非静态调用的静态类对我不起作用。