$这不会在PHP 5.3.4中的user_call_func_array()中传播

时间:2011-03-29 11:07:38

标签: php this

我正在尝试创建一个可以在实例化后通过其他类扩展的对象。我似乎发现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!

任何人都可以对此有所了解或为我的问题提供替代解决方案吗?

感谢。

1 个答案:

答案 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