Многие полагают, что конструкция
new A()->method() неоднозначна. Это заблуждение. По этой логике само выражение new A() в текущем PHP тоже неоднозначно, потому что можно представить, что сначала вызывается функция A(), а потом к её результату применяется new. Но это не так.Грамматика для new выглядит следующим образом:
T_NEW class_name_reference constructor_arguments, где class_name_reference — это либо class_name, либо new_variable, либо (expr) (именно в скобках). В свою очередь new_variable организована специально для new таким образом, что в ней не может быть вызовов со скобками. Получается, что сечайс в PHP мы можем создать объект через new тремя способами: new MyClass(), new $class(), new (getMyClass())(). То есть если хочется для имени класса использовать полноценное выражение с вызовами, нужно обязательно обернуть его в дополнительные скобки. Таким образом разрешается эта неоднозначность.Мой PR никак не нарушает ничего из вышесказанного, лишь делает скобки вокруг всего new-выражения опциональными. По сути, это как вместо
(MyClass::new())->method() писать просто MyClass::new()->method(). Приоритет однозначен и не требует уточнения, код легко читается слева направо. В Java и C# испокон веков можно писать именно так. То, что для вас сейчас непривычно, для джавистов и шарпистов — база.Подтверждением моих слов служит также и то, что по изменённой мной грамматике Bison безошибочно генерирует LR(1) парсер, который потом успешно компилируется в PHP и проходит все тесты. LR(1) парсер является детерминированным и не допускает неоднозначностей в описании грамматики.