为什么构造函数链中需要括号?

问题描述 投票:0回答:5

为什么使用 new 关键字的表达式需要括号才能在链式执行中使用? 例如,在 AS3 中,不需要括号。在 PHP 中,这是对解释器的一种风格帮助还是有我不知道的更大原因?是执行顺序优先问题吗?

PHP 中的构造函数链

感谢这个问题在 PHP 中用对象函数调用链接构造函数我弄清楚了如何......

对象定义

旁白:显然,魔术方法

__construct
总是隐式返回
$this
,如果您显式返回
$this
(或任何与此相关的内容),则不会发生错误/警告/异常。

class Chihuahua
{
    private $food;

    function __construct( $food )
    {
        $this->food = $food;
    }

    function burp()
    {
        echo "$this->food burp!";
    }
}

有效

(new Chihuahua('cake'))->burp();

不起作用(但我希望它能起作用)

new Chihuahua('cake')->burp();
php chaining
5个回答
10
投票

我相信这是因为解释器解析成这个,

new (Chihuahua('cake')->burp());

而不是,

(new Chihuahua('cake'))->burp();

因为

->
new
运算符具有更高的偏好。

并给你一个错误,因为这个,

Chihuahua('cake')->burp()

不明白。希望有帮助。


4
投票

因为

new
运算符的优先级低于
->
运算符。 Php 尝试在
Chihuahua('cake')->burp()
之前运行
new Chihuahua('cake')
。这就是问题所在。


1
投票

不知道为什么你会尝试这样做,但关于 php 有一些需要注意的事情。 首先,是的,您需要在 new Object() 语句周围使用括号将调用内联转换为实际对象。

通过上面的示例,您在调用 burp 方法后会立即丢弃该对象。 如果在这种情况下,您需要一个对象方法来工作而不依赖于所述对象的实例,为什么不只使用静态方法呢?

编辑: 添加到 __complex 静态方法中以展示如何包装构造 -> 执行 -> 处置过程。

class Chihuahua
{
    public static function burp( $food )
    {
        echo "$food burp!";
    }

    protected $food = '';
    public function doBurp()
    {
        echo $this->food . " burp!";
    }

    public function __construct($food)
    {
        $this->food = $food;
    }

    public static __complex( $food )
    {
        $chi = new Chihuahua($food);
        $chi->doBurp();
        unset($chi);
    }
}

Chihuahua::burp("cake");
// - or
Chihuahua::__complex("cake");

0
投票

附注:括号内的构造函数仅适用于 PHP v 5.4 及更高版本。 请参阅 http://3v4l.org/ZANaOhttp://3v4l.org/m9vk9


0
投票

对于 2024 年或以后发现这一点的人来说,PHP 8.4 将引入无需括号即可链接新实例的功能!请参阅RFC

© www.soinside.com 2019 - 2024. All rights reserved.