Я пытаюсь создать объект, который может быть расширен дополнительными классами после создания экземпляра.Кажется, я обнаружил проблему с 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!
Может кто-нибудь пролить свет на это или предложить альтернативное решение моей проблемы?
Спасибо.