为什么PHP构造函数不返回可用对象?

时间:2017-04-14 08:47:17

标签: php oop constructor

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

为什么会这样

new MyClass()->doSomething();

触发错误,而

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

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

按预期工作?

是否有理由需要构造函数周围的括号?

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

3 个答案:

答案 0 :(得分:2)

这似乎只是一个设计决定: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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:-1)

new MyClass

在MyClass对象上返回一个指针,然后就可以像那样访问你的方法

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

因为指针

这里

new MyClass()->func();

你没有访问指针,然后无法使用你的功能,这就是你得到错误的原因