类和静态方法的奇怪的PHP行为

时间:2010-06-25 13:11:12

标签: php

我维护的应用程序使用(对我而言)令人惊讶的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 - 这对我来说似乎是正确的。

有人对此行为有解释吗?

2 个答案:

答案 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()方法添加到该类,并正确使用继承的方法。