Создание объекта внутри другого класса? Вопрос 1 - правилен ли следующий вариант, если нет, то почему?class A { } class B { public $a; function __construct() { $this->a = new A(); } } 2. Даже если это не совсем тру вариант, у меня это работает. Вопрос 2. Почему запись объекта другого класса в свойство можно делать только через конструктор? Вот так не работает, но по синтаксису PHP вроде логично.class A { } class B { public $a = new A(); }upd. Очень интересно было бы узнать мнение тех, кто смотрел исходный код PHP. Может действительно такой подход несет скрытую логику.
Ответ на первый вопрос: Ваш вариант создания объекта класса A внутри класса B через конструктор правильный и будет работать. Это нормальная практика создания объектов одного класса внутри другого через конструктор.
Ответ на второй вопрос: В PHP нельзя инициализировать свойство объекта непосредственно в теле класса, как это можно делать с обычными переменными. Причина в том, что выражения при инициализации свойств объекта должны быть статическими и не могут содержать вызовы функций или создание объектов. Поэтому инициализация свойства объекта другого класса должна быть выполнена в конструкторе, где можно использовать любые действия и функции.
Таким образом, правильным подходом будет инициализировать объект класса A в конструкторе класса B, как вы сделали в вашем первом варианте.
Относительно скрытой логики в исходном коде PHP, стоит отметить, что это больше связано с особенностями языка и соглашениями о стиле программирования, чем с какой-то скрытой логикой, которую разработчики PHP решили внедрить.
Ответ на первый вопрос:
Ваш вариант создания объекта класса A внутри класса B через конструктор правильный и будет работать. Это нормальная практика создания объектов одного класса внутри другого через конструктор.
Ответ на второй вопрос:
В PHP нельзя инициализировать свойство объекта непосредственно в теле класса, как это можно делать с обычными переменными. Причина в том, что выражения при инициализации свойств объекта должны быть статическими и не могут содержать вызовы функций или создание объектов. Поэтому инициализация свойства объекта другого класса должна быть выполнена в конструкторе, где можно использовать любые действия и функции.
Таким образом, правильным подходом будет инициализировать объект класса A в конструкторе класса B, как вы сделали в вашем первом варианте.
Относительно скрытой логики в исходном коде PHP, стоит отметить, что это больше связано с особенностями языка и соглашениями о стиле программирования, чем с какой-то скрытой логикой, которую разработчики PHP решили внедрить.