9

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

PHP中的构造函数链接

感谢这个问题Chaining a constructor with an object function call in PHP我想出了如何......</p>

对象定义

旁白:显然魔术方法__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

4 回答 4

8

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

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

代替,

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

因为->比操作员具有更高的偏好new

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

Chihuahua('cake')->burp()

不明白。希望能帮助到你。

于 2012-12-29T00:50:46.400 回答
4

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

于 2012-12-29T00:51:24.237 回答
1

不知道您为什么要尝试这样做,但有关 php.ini 的一些注意事项。首先,是的,您需要在 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");
于 2012-12-29T00:53:04.017 回答
0

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

于 2015-01-27T09:26:01.030 回答