我正在尝试创建一个可以在实例化后通过其他类扩展的对象。我似乎发现user_call_func_array
(以及此系列函数)没有正确传播$this
变量的问题。
请考虑以下事项:
// Base class
class baseClass {
public $some_value = 'foobar';
public function callManually() {
extensionClass::extendedMethod('hello');
}
public function callDynamically($class,$method) {
call_user_func_array("$class::$method",array('hello'));
}
}
// Extension class
class extensionClass {
public function extendedMethod($local_value) {
if(isset($this)) {
echo '$this is set. Local value = '.$local_value.'. Base value = '.$this->some_value."\n";
} else {
echo '$this is not set. Boo!'."\n";
}
}
}
// Create the base object and call extended method
$base_class = new baseClass;
$base_class->callManually();
$base_class->callDynamically('extensionClass','extendedMethod');
callManually()
和callDynamically()
都会在扩展程序类中调用extendedMethod()
。因此,人们会期望脚本产生以下内容:
$this is set. Local value = hello. Base value = foobar $this is set. Local value = hello. Base value = foobar
但是,由于user_call_func_array
没有正确传播$this
,我在Mac OS X上的PHP 5.3.4中得到以下内容:
$this is set. Local value = hello. Base value = foobar $this is not set. Boo!
任何人都可以对此有所了解或为我的问题提供替代解决方案吗?
感谢。
答案 0 :(得分:1)
如果在第二次调用中未设置$this
,则很自然。
$this
表示类的当前对象,但在您的情况下,类本身正在调用该方法,因此未设置$this
。
class::method(); //The class itself is calling the method hence $this will be unset
Object->method();//$this will be set in this case because object is calling the method