在实例创建时调用对象的方法

xde*_*000 4 php object

在PHP中为什么我不能这样做:

class C
{
   function foo() {}
}

new C()->foo();
Run Code Online (Sandbox Code Playgroud)

但我必须这样做:

$v = new C();
$v->foo();
Run Code Online (Sandbox Code Playgroud)

在所有语言中,我都能做到......

Gor*_*don 16

从PHP 5.4开始,你可以做到

(new Foo)->bar();
Run Code Online (Sandbox Code Playgroud)

在此之前,这是不可能的.看到

但是你有一些替代方案

令人难以置信的难看的解决方案我无法解释:

end($_ = array(new C))->foo();
Run Code Online (Sandbox Code Playgroud)

无意义的Serialize/Unserialize只是为了能够链接

unserialize(serialize(new C))->foo();
Run Code Online (Sandbox Code Playgroud)

使用Reflection的同样无意义的方法

call_user_func(array(new ReflectionClass('Utils'), 'C'))->foo();
Run Code Online (Sandbox Code Playgroud)

使用函数作为工厂的更合理的方法:

// 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();
Run Code Online (Sandbox Code Playgroud)

使用工厂方法模式解决方案最理智的方法:

class C { public static function create() { return new C; } }
C::create()->foo();
Run Code Online (Sandbox Code Playgroud)


小智 8

从PHP 5.4你可以做到: (new Foo())->someMethod();