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

时间:2012-12-29 00:46:13

标签: php chaining

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

使用PHP链接的构造函数

感谢这个问题Chaining a constructor with an object function call in 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();

4 个答案:

答案 0 :(得分:8)

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

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

代替,

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

因为->的优先级高于new运算符。

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

Chihuahua('cake')->burp()

不明白。希望它有所帮助。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

不确定为什么要尝试这样做,但有些事情要注意php。首先,是的,你需要在新的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");

答案 3 :(得分:0)

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