$ это не распространяется в user_call_func_array () в PHP 5.3.4 - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь создать объект, который может быть расширен дополнительными классами после создания экземпляра.Кажется, я обнаружил проблему с 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, я получаю следующее в PHP 5.3.4 на Mac OSX:

$this is set. Local value = hello. Base value = foobar
$this is not set. Boo!

Может кто-нибудь пролить свет на это или предложить альтернативное решение моей проблемы?

Спасибо.

1 Ответ

1 голос
/ 29 марта 2011

Естественно, если $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 
...