实例化对象并在一行中调用方法?

时间:2011-03-10 23:34:18

标签: php oop

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

我们是否可以订阅它以便获得更多关注?

6 个答案:

答案 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')
    );