Intereting Posts
Как работают сеансы PHP? (а не «как они используются?») Как сохранить изображение с URL-адреса с помощью PHP? как читать xml-файл с URL-адреса, используя php Знак фунта (#) не работает в PHP перенос данных формы php в окно js PHP SoapClient: исключение SoapFault Не удалось подключиться к хосту уведомления без перезагрузки страницы (например, facebook или Google плюс уведомления) Активность входа в Android с использованием базы данных mysql Получите последние 50 строк из текстового файла, используя php PHP: Как удалить вложенные теги и перенести их не вложенным образом? Учетная запись Paypal Express Checkout отсутствует. Ошибка 10400 Как закрепить всю папку с помощью PHP Как запустить wget из php, чтобы выход отображался в окне браузера? Войти всегда false на CakePHP 3 Кудрявые фигурные скобки или заявления о двоеточии endif в PHP – какой из них обеспечивает лучшую производительность и совместимость с кодом?

PHP подделал множественное наследование – наличие атрибутов объекта, установленных в поддельном родительском классе, доступном в расширенном классе

Я использовал притворство множественного наследования, как указано в Могу ли я расширить класс, используя более 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; } 

Solutions Collecting From Web of "PHP подделал множественное наследование – наличие атрибутов объекта, установленных в поддельном родительском классе, доступном в расширенном классе"

Это никогда не будет работать, потому что «param» не является свойством A: он находится в c, что является свойством A.

Что вам нужно сделать, так это определить магические методы, такие как __set и __get, которые параллельны __call для свойств.