Php 为什么可以';当我构造一个对象时,我不能使用它吗?

Php 为什么可以';当我构造一个对象时,我不能使用它吗?,php,oop,syntax-error,Php,Oop,Syntax Error,我已经试着寻找这个问题,但坦率地说,我不知道要寻找什么,不幸的是,我想这个问题以前有人问过 在PHP和其他语言中,为什么不能在创建对象后立即使用它 // This causes an error $obj = new Object()->myFunction(); 注意:我在大多数setter函数中返回$this,以便将它们链接在一起 function myFunction() { // ... some more code here ... return $this;

我已经试着寻找这个问题,但坦率地说,我不知道要寻找什么,不幸的是,我想这个问题以前有人问过

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

// This causes an error
$obj = new Object()->myFunction();
注意:我在大多数setter函数中返回
$this
,以便将它们链接在一起

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

    return $this;
}

这是无效的语法

PHP仅支持:

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

请记住,如果您编写示例代码来工作,
$obj
将获得
myFunction()

的返回值,这是无效语法

PHP仅支持:

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

请记住,如果编写示例代码,那么,
$obj
将获得
myFunction()

的返回值,这在PHP中是无效的语法。在PHP5.4中,您可以通过用括号包装对象构造函数表达式来实现这一点:

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

  • 已添加实例化时的类成员访问权限,例如
    (new Foo)->bar()
如果希望
$obj
作为新对象的值,请确保从
Object::myFunction()
返回
$this
(此函数被调用)

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

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

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

这在PHP中只是无效的语法。在PHP5.4中,您可以通过用括号包装对象构造函数表达式来实现这一点:

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

  • 已添加实例化时的类成员访问权限,例如
    (new Foo)->bar()
如果希望
$obj
作为新对象的值,请确保从
Object::myFunction()
返回
$this
(此函数被调用)

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

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

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

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

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

$obj = new (Object()->someFunction());
而不是预期的

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

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

中,尽管没有在网站上记录,但它看起来好像对象操作符->比新关键字具有更高的优先级。这么说:

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

$obj = new (Object()->someFunction());
而不是预期的

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


它以这种方式工作的真正原因是在线775

谢谢Fritz!我的问题是为什么PHP不支持new Object()->myFunction()?答案是:因为。我的许多setter函数
返回$this
这样我就可以将函数链接在一起,这样就可以使
$obj
等于
myFunction()
的返回值。酷:)fluent API非常流行。谢谢Fritz!我的问题是为什么PHP不支持new Object()->myFunction()?答案是:因为。我的许多setter函数
返回$this
这样我就可以将函数链接在一起,这样就可以将
myFunction()的返回值与
myFunction()的返回值相等。。。只有当myFunction返回$thisThank@Orangepill时,才会是对象。我在问题中忘记提到这一点。我再加上now@Orangepill我想知道,这种奇怪的语法怎么用。构造函数就是为此而发明的。@Tim Cooper
(new Foo)->bar()
(new Foo())->bar()
之间有什么区别吗?@chrislondon:没有。在这两种情况下,它们都调用类的构造函数。值得注意的是,$obj将被myFunction的返回填充。。。只有当myFunction返回$thisThank@Orangepill时,才会是对象。我在问题中忘记提到这一点。我再加上now@Orangepill我想知道,这种奇怪的语法怎么用。构造函数就是为此而发明的。@Tim Cooper
(new Foo)->bar()
(new Foo())->bar()
之间有什么区别吗?@chrislondon:没有。在这两种情况下,它们都调用类的构造函数。您可能想链接到。声明T_新令牌并不是“它以这种方式工作的真正原因”。您可能想链接到。宣布T_新代币并不是“它以这种方式工作的真正原因”。