php 5.3
有没有办法做到这一点(例如在java中可行)
(new MyClass())->myMethod();
我正在接受:Parse error: syntax error, unexpected T_OBJECT_OPERATOR in D.. on line 7
我真的需要在下一个PHP版本中实现RFC!
http://wiki.php.net/rfc/instance-method-call
我们是否可以订阅它以便获得更多关注?
答案 0 :(得分:3)
这不是有效的语法。实现所需目标的一种方便方法是使用静态方法创建对象。
在你的MyClass中:
public static function create() {
return new MyClass();
}
然后你可以使用:
MyClass::create()->myMethod();
但是,如果更改构造函数或扩展类,则必须维护额外的代码。所以你需要权衡好处。
答案 1 :(得分:3)
不,不可能。有一个RFC
http://wiki.php.net/rfc/instance-method-call
但没有人知道,什么时候会到达用户地区。
雅各布提到了静态方法。还有其他或多或少有用的方法来实现相同的
function instanciate($className, $arg1 = null) {
$args = func_get_args();
array_shift($args);
$c = new ReflectionClass($className);
return $c->newInstanceArgs($c);
}
instanciate('Classname', 1, 2, 3)->doSomething();
但是,我更喜欢临时变量(如问题所示)。
更新: 我可以在那里发誓,过去问题中的临时变量是一个例子。但是,我的意思是
$x = new Class;
$x->method();
其中$x
是临时变量。
答案 2 :(得分:3)
您可以这样做:
function chain_statements($statement1, $statement2) { return $statement2; }
class TClass { public Method() { ...; return $this; } }
$b = chain_statements($a = new TClass(), $a->Method());
......或更广义:
function chain_statements(array $statements) { return end($statements); }
例如:
function chain_statements($statement1, $statement2) { return $statement2; }
function chain_statements2(array $statements) { return end($statements); }
class TClass
{
public $a = 0;
public function Method1() { $this->a = $this->a + 1; return $this; }
public function Method2() { $this->a = $this->a + 2; return $this; }
}
$b = chain_statements($c = new TClass(), $c->Method1()); echo($b->a);
$b = chain_statements2(array($c = new TClass(), $c->Method1(), $c->Method2())); echo($b->a);
......甚至更好:
function call_method($object) { return $object; }
$b = call_method(new TClass())->Method2(); echo($b->a);
答案 3 :(得分:1)
不是这样的。在PHP中new
不是表达式,而是语言结构。常见的解决方法是为MyClass::get()->...
使用提供静态实例化方法。
更简洁的替代方案是混合工厂功能:
function MyClass() { return new MyClass; }
class MyClass {
...
}
然后将实例化简化为MyClass()->doSomething();
答案 4 :(得分:0)
如果你真的想要,你可以把它放在一个陈述中。使用eval(); p
但你可能不应该。
答案 5 :(得分:0)
我前一段时间遇到过同样的问题,但我发现这个简单的解决方案也很可读。我喜欢它只使用标准PHP函数的事实。无需创建自己的任何实用程序功能。
call_user_func(
array(new ClassToInstance(), 'MethodName'),
'Method arguments', 'go here'
);
您也可以使用call_user_func_array
将参数作为数组传递。
call_user_func_array(
array(new ClassToInstance(), 'MethodName'),
array('Method arguments', 'go here')
);