Посмотрите на следующий пример:
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";
только в объявлении переменных.
Проблема в том, что черты не могут быть созданы __construct()
вроде бессмысленно.
Лучший подход — инициализировать переменные-члены с помощью конструктора классов; вот почему конструкторы существуют.
Если вы хотите инициализировать некоторые члены, которые объявлены в признаке, то используйте функцию признака и вызовите ее в соответствующем конструкторе класса, например:
trait Q {
protected $a;
public function initQ() { $this->a = "whatever"; }
}
class MyClass {
use Q;
public function __construct() {
$this->initQ();
}
}
Других решений пока нет …