繁体   English   中英

通过范围解析运算符调用非静态方法

[英]Invoking a non-static method via the scope resolution operator

发现了PHP解释器的一些奇怪的(对我来说)行为,我不确定它是否可以安全地在生产中使用它。

当我们调用Foo::bar()并且Foo类没有静态bar方法但是它具有非静态bar方法时,解释器将在null上调用非静态bar (是的,这听起来很荒谬)。 我希望在这种情况下调用__callStatic 但这不是出于某种原因发生的事情。

然后我发现了这种行为的一个方便用法:为类提供具有相同名称的静态和非静态方法,如下所示:

class Foo
{
    public function bar(){
        if (isset($this)) {
            $this->nonStaticBar();
        } else {
            static::staticBar();
        }
    }

    private function nonStaticBar() {
        echo "Non-static\n";
    }

    private static function staticBar() {
        echo "Static\n";
    }
}

(new Foo())->bar(); // Output: "Non-static"
Foo::bar(); // Output: "Static"

是的,我知道,这种方法不优雅,在架构上是错误的。 问题是如果使用这个“功能”是否安全(符合标准)。 isset($this)可以等于false时,还有其他任何情况吗?

虽然上面的示例确实有效,但这不是最佳做法。 这是PHP文件中承认这里 ,并指出,在7版本之前的PHP版本中,如果E_STRICT错误报告已启用然后它会发出错误:

Strict Standards: Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22

此外,在PHP 7及更高版本中静态调用静态函数已被弃用,并且在执行时将导致以下错误:

Deprecated:  Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM