想知道下面的例子是如何实际工作的,以及如何能够动态地执行类似的操作。使用call_user_func
或call_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 ..."
当然,在这种情况下,将对象作为参数传递会更清晰、更可取。