Ответ 1
Из руководства руководства по свойствам класса (выделено мной):
Переменные члена класса называются "свойствами". Вы также можете увидеть, как они ссылаются на другие термины, такие как "атрибуты" или "поля", но для целей этой ссылки мы будем использовать "свойства". Они определяются с использованием одного из ключевых слов public, protected или private, за которым следует объявление нормальной переменной. Это объявление может включать инициализацию, но эта инициализация должна быть постоянным значением. То есть она должна быть оценена во время компиляции и не должна зависеть от информации о времени выполнения, чтобы быть оценены.
Либо создайте его внутри конструктора (composition)
class Foo
{
protected $bar;
public function __construct()
{
$this->bar = new Bar;
}
}
или inject он в конструкторе (aggregation)
class Foo
{
protected $bar;
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
}
или используйте инъекцию установщика.
class Foo
{
protected $bar;
public function setBar(Bar $bar)
{
$this->bar = $bar
}
}
Вы хотите поддерживать агрегацию над композицией.