如何从同一个类的静态方法调用非静态方法?

时间:2017-01-13 09:46:33

标签: php oop

我正在处理PHP代码。

以下是解释我的问题的示例代码:

class Foo {

    public function fun1() {
             echo 'non-static';   
    }
    public static function fun2() {
        echo "static" ;
        //self::fun1();
        //Foo::fun1(); 
    }
}

如何从静态方法调用非静态方法?

注意:

  

这两个功能都在整个站点中使用,这是未知的。一世   不能对它们的静态/非静态性质做任何改变。

3 个答案:

答案 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桥接)。因此,没有构造函数和非静态调用的静态类对我不起作用。