在PHP中为什么我不能这样做:
class C
{
function foo() {}
}
new C()->foo();
但我必须这样做:
$v = new C();
$v->foo();
在所有语言中我都能做到......
答案 0 :(得分:15)
从PHP 5.4开始,你可以做到
(new Foo)->bar();
在此之前,这是不可能的。参见
但是你有一些替代方案
令人难以置信的丑陋解决方案我无法解释:
end($_ = array(new C))->foo();
Pointless Serialize / 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解决方案的最明智的方法:
class C { public static function create() { return new C; } }
C::create()->foo();
答案 1 :(得分:8)
从PHP 5.4开始,您可以:(new Foo())->someMethod();
答案 2 :(得分:4)
在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及更高版本,因为需要后期静态绑定。
答案 3 :(得分:1)
您应该无法执行
之类的代码 new C()->foo();
在其他语言中,至少不会只要该语言准确地遵循逻辑。该对象不仅使用C()
创建,而且使用完整new C()
创建。因此,如果包含另一对括号,则假设您应该能够执行该代码:
(new C())->foo();
(请注意:我没有对上述内容进行过测试,我只是说应该假设有效。)
大多数语言(我遇到的)都以同样的方式处理这种情况。 C,C#,Java,Delphi ......
答案 4 :(得分:-1)
我试过这个并且成功了 -
<?php
$obj = new test("testFunc");
class test{
function __construct($funcName){
if(method_exists($this, $funcName)){
self::$funcName();
}
}
function testFunc(){
echo "blah";
return $this;
}
}
?>