【发布时间】:2016-07-23 07:43:39
【问题描述】:
我有found 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 methods static-methods