Я продолжаю натыкаться на эту причуду PHP и не могу объяснить, почему это происходит.
Почему это
new MyClass()->doSomething();
Вызвать ошибку, пока
(new MyClass())->doSomething();
а также
$myObject = new MyClass();
$myObject->doSomething();
работать как положено?
Есть ли веская причина для необходимости скобки вокруг конструктора?
я нашел этот RFC объясняя, что это был осознанный выбор, но я все еще не могу понять причину этого.
MyClass()
может быть вызовом функции, которая возвращает объект, doSomething
Метод возвращает строку, которая ссылается на класс, который вы затем пытаетесь создать new
т.е.
$className = MyClass()->doSomething();
new $className;
Добавленный ()
предназначены для синтаксической неоднозначности.
Кажется, просто дизайнерское решение: https://wiki.php.net/rfc/instance-method-call
Более того, хорошо работает с цепочкой вызовов функций (https://wiki.php.net/rfc/fcallfcall) и разыменование
Здесь полное обсуждение PHP Internals ML:
https://www.mail-archive.com/internals@lists.php.net/msg48787.html
new MyClass
возвращает указатель на объект MyClass, тогда вы можете получить доступ к своему методу, как это
(new MyClass())->func();
из-за указателя
Вот
new MyClass()->func();
вы не получаете доступ к указателю, а затем не можете использовать свою функцию, и поэтому вы получаете сообщение об ошибке