【问题标题】:Why PHP constructors don't return a usable object?为什么 PHP 构造函数不返回可用对象?
【发布时间】:2017-04-14 08:47:17
【问题描述】:

我一直被这个 PHP 怪癖绊倒,似乎无法解释自己为什么会发生这种情况。

为什么会这样

new MyClass()->doSomething();

触发错误,同时

(new MyClass())->doSomething();

$myObject = new MyClass();
$myObject->doSomething();

按预期工作?

是否有正当理由需要在构造函数周围使用方括号?

我发现this RFC 解释说这是一个有意识的选择,但我似乎仍然无法理解它的原因。

【问题讨论】:

标签: php oop constructor


【解决方案1】:

这似乎只是一个设计决定:https://wiki.php.net/rfc/instance-method-call

此外,函数调用链 (https://wiki.php.net/rfc/fcallfcall) 和取消引用也能很好地工作

这里是关于 PHP Internals ML 的完整讨论: https://www.mail-archive.com/internals@lists.php.net/msg48787.html

【讨论】:

    【解决方案2】:

    MyClass() 可以是一个函数调用,它返回一个对象,该对象的doSomething 方法返回一个字符串,该字符串引用一个类,然后您尝试用new 实例化该类,即:

    $className = MyClass()->doSomething();
    new $className;
    

    添加的() 用于语法消歧。

    【讨论】:

      【解决方案3】:
      new MyClass
      

      返回一个指向 MyClass 对象的指针,然后你可以像这样访问你的方法

      (new MyClass())->func();
      

      因为指针

      这里

      new MyClass()->func();
      

      你不访问指针,然后不能使用你的函数,这就是你得到错误的原因

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 2010-10-16
        • 2011-03-21
        • 1970-01-01
        相关资源
        最近更新 更多