为什么我在构造它时不能使用对象?

时间:2013-06-11 19:35:57

标签: php oop syntax-error

我已经尝试过搜索这个但坦率地说我不知道​​该搜索什么,不幸的是我想象之前已经问过这个问题了。

在PHP和其他语言中,为什么我在创建对象后不能立即使用它?

// This causes an error
$obj = new Object()->myFunction();

注意:我在大多数setter函数中返回$this,因此我可以将它们链接在一起

function myFunction() {
    // ... some more code here ...

    return $this;
}

3 个答案:

答案 0 :(得分:6)

这只是PHP中无效的语法。通过用括号包装对象构造函数表达式,您可以在PHP 5.4中使用它:

$obj = (new Object())->myFunction();

请参阅PHP 5.4 new features

  
      
  • 已添加实例化的类成员访问权限,例如(new Foo)->bar()
  •   

如果您希望$obj成为新对象的值,请务必从$this返回Object::myFunction()(这称为method chaining)。

使构造函数链接起作用的另一种方法是在类中使用静态方法为您创建新的类实例:

class Object {
    public function __construct($var) {
        $this->var = $var;
    }
    public static function newObject($var) {
        return new Object($var);
    }
}

$obj = Object::newObject()->chainMethodX()->chainMethodY()->...

答案 1 :(得分:2)

这是无效的语法。

PHP仅支持:

$obj = new Object();
$obj->myFunction();

请注意,如果您将代码编入代码,$obj将获得myFunction()的返回值。

答案 2 :(得分:1)

虽然没有在网站上记录,但似乎对象操作符->的优先级高于new关键字。所以说:

$obj = new Object()->someFunction();
像你写的那样评估

$obj = new (Object()->someFunction());

而不是预期的

$obj = (new Object())->someFunction();

它以这种方式工作的真正原因是在第775行的the php grammer definition