Многократное наследование + Многоуровневое наследование в PHP: существует ли шаблон или возможность решить наследование конструктора?

Посмотрите на следующий пример:

class A {
protected $a;
public function __construct() {
$this->a = "foo";
}
}

trait Q {
protected $q;
public function __construct() {
$this->q = "happy";
}
}

class B extends A {
use Q;
protected $b;
public function __construct() {
$this->b = "bar";
}
}

trait X {
protected $x;
public function __construct() {
$this->x = "lorem";
}
}

class C extends B {
use X;
protected $c;
public function __construct() {
$this->c = "sure";
}

public function giveMeEverything() {
echo $this->a." ".$this->b." ".$this->c." ".$this->x." ".$this->q;
}
}

$c = new C();
$c->giveMeEverything();

Это работает просто отлично — вывод:

конечно

Дело в том, что я хочу, чтобы все классы и признаки в дереве инициализировали свои переменные-члены. Желаемый результат:

foobarsureloremhappy

Это не должно быть решено с помощью конструкторов! Я просто хочу, чтобы переменные-члены заполнялись при инициализации, но я все еще не знал, как это решить. В реальном мире это сложнее, поэтому, пожалуйста, не $a = "foo"; только в объявлении переменных.

0

Решение

Проблема в том, что черты не могут быть созданы __construct() вроде бессмысленно.

Лучший подход — инициализировать переменные-члены с помощью конструктора классов; вот почему конструкторы существуют.

Если вы хотите инициализировать некоторые члены, которые объявлены в признаке, то используйте функцию признака и вызовите ее в соответствующем конструкторе класса, например:

trait Q {
protected $a;
public function initQ() { $this->a = "whatever"; }
}

class MyClass {
use Q;

public function __construct() {
$this->initQ();
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]