PHP поддельное множественное наследование - в расширенном классе доступны атрибуты объекта в поддельном родительском классе - PullRequest
2 голосов
/ 10 ноября 2010

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

public function __get($name)
{   
   return $this->c->$name;
}

1 Ответ

2 голосов
/ 10 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...