【问题标题】:Why are parentheses needed in constructor chaining?为什么在构造函数链接中需要括号?
【发布时间】:2012-12-14 04:45:11
【问题描述】:

为什么使用 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();

【问题讨论】:

  • 因为 PHP 语法一团糟。有些事情会随机发挥作用,有些则不会。
  • @melpomene:我不会把它归类为一团糟,只是挑剔。
  • 它看起来像是一种从新实例添加方法链接的快速方法,依赖于运算符优先级
  • @melpomene,PHP 是一团糟,但在这种情况下并非如此。感谢上帝,有一种叫做“运算符优先级”的东西。而且我敢肯定,为了正确起见,OP 会解决增加 2 个括号的大问题。
  • @Jeffrey JavaScript 也有一个叫做“运算符优先级”的东西,你不需要 JS 中的括号(因为new 的优先级高于方法调用(为什么不呢?)) .你的论点无效。

标签: php chaining


【解决方案1】:

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

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

而不是,

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

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

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

Chihuahua('cake')->burp()

不明白。希望对您有所帮助。

【讨论】:

  • 令人讨厌的是,PHP 手册不包括 -> 的运算符优先级,但我假设给出示例,-> 运算符比 new 绑定更紧密(如图所示无论如何作为最高优先级:S)
  • 我会接受你的假设是正确的,因为它很清楚而且看起来很明智。
  • @rae1:在 C# 中,Dictionary<string> d = new Dictionary<string>(); 可以编译,但在我的 PHP 版本中不起作用。可能是我的特定实现中的错误。 :)
【解决方案2】:

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

【讨论】:

  • 有趣的是,PHP 文档没有在 Operator Precedence 页面上列出对象运算符。
  • @Jeffery 我最初也是这么想的,但选择的答案基本上是一样的,而且写得更好。
【解决方案3】:

不知道你为什么会尝试这样做,但是关于 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");

【讨论】:

  • 好点。我认为静态调用对于实用程序类是有意义的,但在某些情况下,您需要使用复杂对象但不需要将其保留在变量中的开销。我发现在正确的上下文中,它有助于阐明对象在某个范围内使用过一次这一事实。
  • 静态构造器模拟器?公共静态函数 __complex($food) { $chi = new Chihuahua($food); $chi->burp();未设置($chi); }
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 2015-10-03
    • 2018-06-02
    • 2020-03-10
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多