我维护的应用程序使用(对我而言)令人惊讶的PHP怪癖/错误/功能。请考虑以下代码:
<?php
class Bar {
// called statically
public function doStuff() {
print_r($this);
}
}
class Foo {
public function main() {
Bar::doStuff();
}
}
$foo = new Foo();
$foo->main();
在PHP 5.2.x上运行,输出为:
Foo Object ( )
这意味着,虽然Bar::doStuff()
是静态调用的,但它仍然可以访问$this
,其中$this
是对调用Bar::doStuff()
的对象的引用。直到最近才发现过这种行为。如果你问我的话,在生产代码中依赖于这个很邪恶。
如果您添加static
并将方法签名更改为public static function doStuff()
,则会抛出E_NOTICE: Undefined variable: this
- 这对我来说似乎是正确的。
有人对此行为有解释吗?
答案 0 :(得分:4)
至少在PHP 5.3中,您会收到严格的警告:
PHP Strict Standards: Non-static method Bar::doStuff() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 11
非常理所当然。
答案 1 :(得分:0)
最好创建某种类型的Printable_Object类,然后继承它。将doStuff()方法添加到该类,并正确使用继承的方法。