PHP 5.3中使用实例方法的奇怪结果


Strange result using instance methods in PHP 5.3

想知道下面的例子是如何实际工作的,以及如何能够动态地执行类似的操作。使用call_user_funccall_user_func_array不允许发生这种情况。

<?php
class Person
{
    public $name = "George";
    public function say_hi()
    {
            return ExtraMethods::hi();
    }
}
class ExtraMethods
{
    public function hi()
    {
            return "Hi, ".$this->name;
    }
}
$george = new Person();
echo $george->say_hi();
?>

结果应该是:

Hi, George

想知道为什么实例方法hi不仅可以静态调用(在PHP中发生这种情况并不奇怪),而且为什么我能够使用$this

来自手册:

当从对象上下文中调用方法时,伪变量$this可用$这是对调用对象的引用(通常是该方法所属的对象,但如果从辅助对象的上下文静态调用该方法,则可能是另一个对象)。

因此,根据第二部分,通过设计。请记住,它使用了现有的实际对象实例(换句话说,如果将public $name = "SomethingElse";添加到ExtraMethods,结果仍然是Hi, George)。

静态调用该方法不是正确的编码,但PHP原谅了你,只发出了一个严格错误:

"Strict Standards: Non-static method ExtraMethods::hi() should not be called statically, assuming $this from incompatible context in ..."

当然,在这种情况下,将对象作为参数传递会更清晰、更可取。