2017-02-01 12 views
2

Я немного запутался об ошибке синтаксического анализа:PHP5 - Назначение результата операции не рассматривается в качестве объекта анализатора

class Foo{ 
    public function some_function(){}   
} 

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

дает

PHP Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ';'

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

The type and value of the result is the type and value of the left-hand operand after the store (if any [see below]) has taken place. The result is not an lvalue.

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

Я что-то не хватает?

EDIT

PHP версия 5.5.9

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

+2

Какая версия php использует компилятор ur? – Yannjoel

+0

версия PHP отсутствует. '5.3' Я полагаю? –

+0

php версия 5.5.9 – Bastien

ответ

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 был unparse-состоянием, но он имел законное использование в хорошем коде, так что синтаксический анализатор был исправлен для этого работу ,

+0

Хорошо, в принципе, php parser даже не соответствует спецификациям языка. Это, конечно, не улучшает то, как я вижу php. – Bastien

+0

@Bastien согласен. люди не хотят использовать «php как язык», но предпочитают использовать «php как платформу», хотя язык ужасен. Все о идее «ничего общего, 1 процесс за запрос» от создателя. У вас может быть команда плохих разработчиков, которые пишут багги-код, используя библиотеки с утечками памяти, и по-прежнему поставляют рабочее приложение, которое легко масштабируется на десятках серверов, обслуживающих миллион пользователей (магия «это ошибка здесь, но она только падает на 0,01% запросов, так что клиенты не заботятся, деньги продолжают течь »- с помощью nodejs или go, у вас обычно есть одна ошибка, снимающая все ваше приложение) – NeuronQ

+0

@Bastien, но как разработчик, то, что я упомянул выше, перевести только на« худшую плату », и «больше стресса», если у вас нет неестественного подарка для очистки чужих кодовых вещей :) – NeuronQ