Давайте рассмотрим следующий код:
<?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 )?
Поскольку это неоднозначно, то есть это может интерпретироваться двумя различными способами:
Вызов 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
Но все же, вы поняли идею.
Других решений пока нет …