@Hellek
Люблю говорить и слышать суть

Создание объекта внутри другого класса?

Вопрос 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. Может действительно такой подход несет скрытую логику.
  • Вопрос задан
  • 690 просмотров
Решения вопроса 2
DevMan
@DevMan
Вот так не работает, но по синтаксису PHP вроде логично.
ибо
This declaration may include an initialization, but this initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.

соглашаться или нет - дело ваше. только в реале это ничего не изменит.
Ответ написан
Комментировать
Потому что до версии 7.0 у PHP был весьма убогий парсер, основанный на алгоритме LALR. Но без AST, он накладывает существенные ограничения на возможности разбора и последующей компиляции.
В 7.0 запилили AST, которое открывает более широкие возможности, связанные с парсом и анализом программы, но до вышеописанной конструкции они не дошли, т.е. получающиеся узлы в AST никак не анализируются, но, потенциально, возможность использования неконстантных выражений в объявлении полей класса сейчас есть.
Можете написать разработчикам в рассылку "php internals" с просьбой реализовать. Может быть кто-то поможет. А может и нет.

UPD.
Вот, RFC от Никиты Попова (один из разработчиков ядра PHP), объясняющий необходимость реализации AST: https://wiki.php.net/rfc/abstract_syntax_tree
И веб-интерфейс рассылки "php internals": externals.io

UPD2.
Я не слишком силён в ядре и в runtime'е PHP, поэтому не смогу дать вам полный ответ на ваш вопрос. Лучше всего если вы спросите у непосредственно разработчиков в этой рассылке.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы