我继续绊倒这个PHP的怪癖,似乎无法解释自己为什么会发生这种情况。
为什么会这样
new MyClass()->doSomething();
触发错误,而
(new MyClass())->doSomething();
和
$myObject = new MyClass();
$myObject->doSomething();
按预期工作?
是否有理由需要构造函数周围的括号?
我发现this RFC解释说这是一个有意识的选择,但我似乎无法理解它的原因。
答案 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();
你没有访问指针,然后无法使用你的功能,这就是你得到错误的原因