& Quot; Оператор & Quot; предшествования? Почему new Object () -> метод () дает синтаксическую ошибку в PHP?

Давайте рассмотрим следующий код:

<?php

class X{
public function test(){
return 'test';
}
}

//This obviously works:
$x = (new X())->test();
//This does not, syntax error
$x = new X()->test();
echo $x;

Зачем?

КСТАТИ:
Я знаю, что это было введено в PHP 5.4

Дело не в том «как», а в «Зачем«- Я знаю, что первый синтаксис описан в руководстве. На самом деле, это больше о том, где и как найти ответ.

Из того, что я узнал до сих пор, задавая свои вопросы в другом месте:

-> на самом деле не «оператор», это «токен» или «лексический токен» — что мне мало помогает.

Первая версия эквивалентна поговорке: «new (DateTime () -> format ())», что явно плохо. Это говорит о «приоритете операторов», но # 1 — -> не является оператором (верно?) И # 2 — почему это нигде не задокументировано?

Кстати, на http://php.net/manual/en/language.operators.precedence.php мы можем прочитать, что «новая» ассоциативность операторов не является ни левой, ни правой, это ни один, и мы также можем прочитать «Операторы равного приоритета, которые не являются ассоциативными, не могут использоваться рядом друг с другом, например 1 < 2> 1 недопустимо в PHP «так что … если -> был оператор (и это было неассоциативно) тогда все было бы понятно, но оператор ли это? Если это так, то почему его нет в списке выше ( http://php.net/manual/en/language.operators.precedence.php )?

1

Решение

Поскольку это неоднозначно, то есть это может интерпретироваться двумя различными способами:

  • Вызов test() на новом X экземпляр (тот, который вы хотите):

    $ object = new X ();
    $ x = $ object-> test ();
    
  • Создайте новый экземпляр имени класса, возвращаемого методом test() на объекте, возвращенном функция X():

    $ object = X ();
    $ class = $ object-> test ();
    $ x = новый $ class ();
    

Как ни странно, на самом деле нет способа написать однострочник для второго случая … следующее не будет работать:

new (X()->test());   // syntax error
new (X()->test())(); // syntax error

Но все же, вы поняли идею.

1

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

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

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