Вызов функции сразу после конструктора: new Object()->callFunction()

Как вы могли заметить из заголовка, мой опыт программирования — Java. В Java вы можете делать такие вещи

new Object().callSomeMethod();

без присвоения созданного объекта переменной, очень полезное и понятное кодирование, если вам нужен этот объект только один раз.

Теперь в PHP я пытаюсь сделать то же самое

new Object()->callSomeMethod();

но здесь я получаю «Ошибка синтаксического анализа: синтаксическая ошибка, непредвиденная» -> «(T_OBJECT_OPERATOR)».

Есть ли способ сделать это в PHP?


person Basti Funck    schedule 18.09.2013    source источник
comment
Только в PHP ›= 5.4, например. echo (new DateTime())->format('d-M-Y');   -  person Mark Baker    schedule 18.09.2013
comment
Объявить метод статическим? Object::callSomeMethod();   -  person iswinky    schedule 18.09.2013
comment
@MarkBaker Нет. я видел в 5.4   -  person BlitZ    schedule 18.09.2013
comment
Статика - это не вариант, это должен быть объект :) @MarkBaker Спасибо, это то, что я искал   -  person Basti Funck    schedule 18.09.2013
comment
@Basti - тогда примите ответ Кита, так как он дал правильное решение   -  person Mark Baker    schedule 18.09.2013


Ответы (1)


(new Object())->callSomeMethod();

будет работать в PHP 5.4+

ИЗМЕНИТЬ

Это новая функция, добавленная в PHP 5.4:

Добавлен доступ к членам класса при создании экземпляра, например. (new Foo)->bar().

ИЗМЕНИТЬ2

RFC для функции PHP предлагает два набора синтаксиса (с квадратными скобками и без них), оба из них реализованы в RFC, но выпущен только один. Я не смог найти ссылки, объясняющие решение.

Давайте посмотрим на примеры синтаксиса без квадратных скобок в RFC:

  • new foo->bar() следует читать как (new foo)->bar()
  • new $foo()->bar следует читать как (new $foo())->bar
  • new $bar->y()->x следует читать как (new ($bar->y)())->x

Я думаю, что синтаксис без квадратных скобок не поставляется, потому что предлагаемый приоритет синтаксического анализа не очень интуитивно понятен (трудно понять глазами), как показано в 3-м примере.

person Kita    schedule 18.09.2013
comment
Почему PHP не разрешает синтаксис, упомянутый OP? - person Jon Koops; 12.01.2014
comment
Можете ли вы включить информацию о том, почему скобки необходимы? Согласно списку приоритетов операторов, new имеет наивысший приоритет, но -> нигде в этом списке не встречается... - person Jasper; 12.02.2015
comment
Спасибо, но это не относится к моему вопросу, почему скобки необходимы. - person Jasper; 13.02.2015