我已经found PHP解释器的一些奇怪的(对我来说)行为,我不确定它是否可以安全地在生产中使用。
当我们调用Foo::bar()
并且Foo
类没有静态bar
方法但是它具有非静态bar
方法时,解释器将调用非静态bar
null
(是的,这听起来很荒谬)。我希望在这种情况下调用__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
时,还有其他任何情况吗?
答案 0 :(得分:3)
虽然您的上述示例确实有效,但这不是最佳做法。
这在PHP文档here中得到了认可,并指出在版本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