Kol*_*nya 6 php methods static-methods
我发现了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"
Run Code Online (Sandbox Code Playgroud)
是的,我知道,这种方法不优雅,在架构上是错误的.问题是如果使用这个"功能"是否安全(符合标准).有什么其他情况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
Run Code Online (Sandbox Code Playgroud)
此外,在 PHP 版本 7 及更高版本中,静态调用静态函数已被弃用,并且在执行时会导致以下错误:
Deprecated: Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |