Php 通过作用域解析操作符调用非静态方法

Php 通过作用域解析操作符调用非静态方法,php,methods,static-methods,Php,Methods,Static Methods,对于我来说,PHP解释器有一些奇怪的行为,我不确定在生产中使用它是否安全 当我们调用Foo::bar()并且Foo类没有静态的bar方法,但是它有非静态的bar方法时,解释器将在null上调用非静态的bar(是的,听起来很可笑)。我希望在这种情况下调用\uu callStatic。但这不是出于某种原因发生的事情 然后,我发现了这种行为的一种简便用法:为类提供具有相同名称的静态和非静态方法,如下所示: class Foo { public function bar(){ i

对于我来说,PHP解释器有一些奇怪的行为,我不确定在生产中使用它是否安全

当我们调用
Foo::bar()
并且
Foo
类没有静态的
bar
方法,但是它有非静态的
bar
方法时,解释器将在
null
上调用非静态的
bar
(是的,听起来很可笑)。我希望在这种情况下调用
\uu 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

谢谢你参考这些文件。我认为在这种情况下必须调用
\u callStatic
。该类没有具有此名称的静态方法。文档指出,在静态上下文中调用不可访问的方法时会触发
\uu callStatic()。
@Kolyunya在尝试在静态(或非静态)上下文中分配/重新分配变量
$this
时,我注意到了一件有趣的事情方法是它将返回致命错误
致命错误:无法在/Path/to/file.php中重新分配$this
。因此,即使这不是最佳实践,我也无法想象另一种情况下,
isset($this)
将等于
false