Я немного озадачен ошибкой разбора:
class Foo{
public function some_function(){}
}
($foo = new Foo())->some_function();
доходность
Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданное ‘->’ (T_OBJECT_OPERATOR), ожидание ‘,’ или ‘;’
Вот что php-langspec сообщает о простом выражении присваивания:
Тип и значение результата — это тип и значение левого операнда после сохранения (если есть [см. Ниже]). Результат не lvalue.
Теперь, насколько я понимаю, результат присваивания должен быть эквивалентен переменной, за исключением того, что он не будет lvalue (присваивание невозможно). Так почему же там ошибка?
Я что-то пропустил?
РЕДАКТИРОВАТЬ
PHP версия 5.5.9
Это не связано с методами цепочки, это ошибка синтаксического анализа, а не ошибка времени выполнения.
Короткий ответ: Подобные выражения теперь отлично работают в 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
был в состоянии разобрать, но он имел законное использование в хорошем коде, поэтому анализатор был исправлен, чтобы это работало.
Других решений пока нет …