Я использовал притворство множественного наследования, как указано в Могу ли я расширить класс, используя более 1 класс в PHP?
Обратите внимание, что класс A фактически расширяет класс B, а подделка выполняется для продолжения от класса C.
Он работал нормально, пока мне не понадобился атрибут, установленный в функции класса C, который будет доступен в классе A. Рассмотрим небольшую отредактированную версию этого кода, где я вызываю функцию класса C изнутри функции класса A:
//Class A class A extends B { private $c; public function __construct() { $this->c = new C; } // fake "extends C" using magic function public function __call($method, $args) { return call_user_func_array(array($this->c, $method), $args); } //calling a function of class C from inside a function of class A public function method_from_a($s) { $this->method_from_c($s); echo $this->param; //Does not work } //calling a function of class B from inside a function of class A public function another_method_from_a($s) { $this->method_from_b($s); echo $this->another_param; //Works } } //Class C class C { public function method_from_c($s) { $this->param = "test"; } } //Class B class B { public function method_from_b($s) { $this->another_param = "test"; } } $a = new A; $a->method_from_a("def"); $a->another_method_from_a("def");
Таким образом, атрибут, установленный в функции класса C, впоследствии не доступен в классе A, но если он задан в классе B, он доступен в классе A. Какую настройку я не вижу, чтобы сделать настройку атрибутов в работе поддельного родительского класса как настоящие? Атрибут, установленный в функции фальшивого родителя, должен быть доступен во всех классах иерархии, как в обычном случае.
благодаря
решаемая
Я добавил магическую функцию __get () в класс A, и она сработала.
public function __get($name) { return $this->c->$name; }
Это никогда не будет работать, потому что «param» не является свойством A: он находится в c, что является свойством A.
Что вам нужно сделать, так это определить магические методы, такие как __set и __get, которые параллельны __call для свойств.