【发布时间】:2010-03-29 09:29:28
【问题描述】:
在 PHP 中为什么我不能这样做:
class C
{
function foo() {}
}
new C()->foo();
但我必须这样做:
$v = new C();
$v->foo();
在所有语言中我都可以做到这一点......
【问题讨论】:
在 PHP 中为什么我不能这样做:
class C
{
function foo() {}
}
new C()->foo();
但我必须这样做:
$v = new C();
$v->foo();
在所有语言中我都可以做到这一点......
【问题讨论】:
从 PHP 5.4 开始你可以做
(new Foo)->bar();
在此之前,这是不可能的。见
但是你有一些选择
难以置信的丑陋解决方案,我无法解释:
end($_ = array(new C))->foo();
无意义的序列化/反序列化只是为了能够链接
unserialize(serialize(new C))->foo();
使用反射同样毫无意义的方法
call_user_func(array(new ReflectionClass('Utils'), 'C'))->foo();
使用 Functions as a Factory 的方法更加理智:
// 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();
【讨论】:
从 PHP 5.4 开始,您可以:(new Foo())->someMethod();
【讨论】:
在 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 及更高版本,因为需要后期静态绑定。
【讨论】:
你应该不能像这样执行代码
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;
}
}
?>
【讨论】: