我对解析错误感到有点困惑:
class Foo{
public function some_function(){}
}
($foo = new Foo())->some_function();
产量
PHP Parse错误:语法错误,意外' - >' (T_OBJECT_OPERATOR),期待','或';'
这是php-langspec关于简单赋值表达式的内容:
结果的类型和值是商店(如果有[见下文])发生后左侧操作数的类型和值。结果不是左值。
现在据我所知,赋值结果应该等于变量,除了它不是左值(不可能赋值)。那么为什么会有错误?
我错过了什么吗?
修改
php版本是5.5.9
这与链接方法无关,这是解析错误,而不是运行时错误。
答案 0 :(得分:2)
简答:这些表达式现在在PHP 7.x中运行良好。 Yeey!
长答案: PHP的“手工制作解析器”存在严重限制,尤其是在PHP< 7.0。你希望工作的很多复杂的表达方式都没有。
但它至少保留了自己奇怪的“对称性”:正如它不适用于将->
运算符应用于赋值的结果一样,它也不适用于应用数组索引运算符[...]
。
例如(在PHP 5.6.23上尝试这个):
>>> ($x = new stdClass())->foo
PHP Parse error: Syntax error, unexpected T_OBJECT_OPERATOR on line 1
>>> $x = new stdClass()
=> {#334}
>>> $x->foo
PHP error: Undefined property: stdClass::$foo on line 1
>>> // this above is the "correct" error you would expect here
>>> ($x = ['name' => 'J'])['name']
PHP Parse error: Syntax error, unexpected '[' on line 1
>>> $x = ['name' => 'J']
>>> $x['name']
=> "J"
纯粹推测:我想要修复这些解析器的不一致性 很简单,但PHP的核心开发人员没有这样做的理由 可能听起来像,但修复这会鼓励一个非常糟糕的编码风格,因为每个人都同意使用分配的结果是一个不好的做法,所以因为已经有这么多糟糕的PHP代码, 为什么要添加一个可以鼓励人们编写更多错误代码的修复程序“。值得庆幸的是,理由胜过PHP 7.0。
历史记录:我过去的一些PHP版本,无法准确记住哪些,甚至像my_function()['attr1']
或$foo->myMethod()->myField
这样的代码都是无法解析的,但它有合法的用途好的代码,所以解析器已得到修复,以便工作。