Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从同一类的静态方法调用非静态方法?_Php_Oop - Fatal编程技术网

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