PHP5 — результат операции присваивания не обрабатывается парсером как объект

Я немного озадачен ошибкой разбора:

class Foo{
public function some_function(){}
}

($foo = new Foo())->some_function();

доходность

Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданное ‘->’ (T_OBJECT_OPERATOR), ожидание ‘,’ или ‘;’

Вот что php-langspec сообщает о простом выражении присваивания:

Тип и значение результата — это тип и значение левого операнда после сохранения (если есть [см. Ниже]). Результат не lvalue.

Теперь, насколько я понимаю, результат присваивания должен быть эквивалентен переменной, за исключением того, что он не будет lvalue (присваивание невозможно). Так почему же там ошибка?

Я что-то пропустил?

РЕДАКТИРОВАТЬ

PHP версия 5.5.9

Это не связано с методами цепочки, это ошибка синтаксического анализа, а не ошибка времени выполнения.

2

Решение

Короткий ответ: Подобные выражения теперь отлично работают в PHP 7.x. Yeey!


Длинный ответ: PHP «созданный вручную парсер» имеет серьезный ограничения, особенно в PHP < 7,0. Множество сложных выражений, которые вы ожидаете получить, не надо.

Но по крайней мере он сохраняет свою странную «симметрию»: так же, как он не работает для применения -> оператор к результату присваивания, он также не работает для применения оператора индексации массива [...],

Например (пробуя это на PHP 5.6.23):

>>> ($x = new stdClass())->foo
PHP Parse error: Syntax error, unexpected T_OBJECT_OPERATOR on line 1

>>> $x = new stdClass()
=> {#334}
>>> $x->foo
PHP error:  Undefined property: stdClass::$foo on line 1
>>> // this above is the "correct" error you would expect here>>> ($x = ['name' => 'J'])['name']
PHP Parse error: Syntax error, unexpected '[' on line 1

>>> $x = ['name' => 'J']
>>> $x['name']
=> "J"

Чистая спекуляция: Я полагаю, что исправление этих несоответствий парсера
было просто, но рассуждения основных разработчиков PHP не делали этого
может звучать что-то вроде «но исправление этого приведет к действительно плохому стилю кодирования, поскольку все согласны с тем, что использование результатов присваиваний является плохой практикой, так как в дикой природе уже так много плохого кода PHP,
зачем добавлять исправление, которое побудило бы людей писать еще более плохой код »
. К счастью, причина преобладала в PHP 7.0.

История: Я некоторые прошлые версии PHP, не могу вспомнить, какой именно, даже код, как my_function()['attr1'] или же $foo->myMethod()->myField был в состоянии разобрать, но он имел законное использование в хорошем коде, поэтому анализатор был исправлен, чтобы это работало.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]