В PHP почему я не могу:
class C { function foo() {} } new C()->foo();
но я должен сделать:
$v = new C(); $v->foo();
На всех языках я могу это сделать …
В PHP вы не можете вызвать произвольный метод для только что созданного объекта, например new Foo()->someMethod();
Извините, но так оно и есть.
Но вы можете построить такую работу:
<?php class CustomConstructor { public static function customConstruct($methodName) { $obj = new static; //only available in PHP 5.3 or later call_user_method($methodName, $obj); return $obj; } }
Расширьте CustomContructor следующим образом:
class YourClass extends CustomConstructor { public function someCoolMethod() { //cool stuff } }
И создайте их так:
$foo = YourClass::customConstruct('someCoolMethod');
Я не тестировал его, но это или что-то вроде этого должно работать.
Исправление: это будет работать только в PHP 5.3 и более поздних версиях, так как требуется поздняя статическая привязка.
Начиная с PHP 5.4 вы можете сделать
(new Foo)->bar();
До этого это невозможно. Видеть
Но у вас есть несколько альтернатив
Невероятно уродливое решение я не могу объяснить:
end($_ = array(new C))->foo();
Бессмысленный Сериализовать / Unserialize только для того, чтобы иметь возможность цепочки
unserialize(serialize(new C))->foo();
Точно бессмысленный подход с использованием Reflection
call_user_func(array(new ReflectionClass('Utils'), 'C'))->foo();
Несколько более здравый подход с использованием функций как фабрики:
// global function function Factory($klass) { return new $klass; } Factory('C')->foo() // Lambda PHP < 5.3 $Factory = create_function('$klass', 'return new $klass;'); $Factory('C')->foo(); // Lambda PHP > 5.3 $Factory = function($klass) { return new $klass }; $Factory('C')->foo();
Наиболее разумный подход с использованием метода Factory Method Pattern Solution:
class C { public static function create() { return new C; } } C::create()->foo();
Из PHP 5.4 вы можете: (new Foo())->someMethod();
Вы не сможете выполнять код как
new C()->foo();
на других языках, по крайней мере, не до тех пор, пока этот язык точно следует логике. Объект создается не только с помощью C()
, но и с полным new C()
. Поэтому вы должны гипотетически иметь возможность выполнить этот код, если вы включаете другую пару круглых скобок: (new C())->foo();
(Будьте осторожны: я не тестировал выше, я просто говорю, что это должно гипотетически работать.)
Большинство языков (с которыми я столкнулся) справляются с этой ситуацией одинаково. C, C #, Java, Delphi …
Я пробовал это и добился успеха –
<?php $obj = new test("testFunc"); class test{ function __construct($funcName){ if(method_exists($this, $funcName)){ self::$funcName(); } } function testFunc(){ echo "blah"; return $this; } } ?>