Извикване на функция директно след конструктора: 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 - тогава приемете отговора на Kita, тъй като той е получил правилното решение   -  person Mark Baker    schedule 18.09.2013


Отговори (1)


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

ще работи в PHP 5.4+

РЕДАКТИРАНЕ

Това е нова функция, добавена към PHP 5.4:

Добавен е достъп на член на класа при инстанциране, напр. (new Foo)->bar().

РЕДАКТИРАНЕ 2

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

Нека да разгледаме примерите за синтаксис без скоби в RFC:

  • new foo->bar() трябва да се чете като (new foo)->bar()
  • new $foo()->bar трябва да се чете като (new $foo())->bar
  • new $bar->y()->x трябва да се чете като (new ($bar->y)())->x

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

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