PHP5 - 解析器

时间:2017-02-01 13:00:42

标签: php parsing syntax assignment-operator

我对解析错误感到有点困惑:

class Foo{
    public function some_function(){}        
}

($foo = new Foo())->some_function();

产量

  

PHP Parse错误:语法错误,意外' - >' (T_OBJECT_OPERATOR),期待','或';'

这是php-langspec关于简单赋值表达式的内容:

  

结果的类型和值是商店(如果有[见下文])发生后左侧操作数的类型和值。结果不是左值。

现在据我所知,赋值结果应该等于变量,除了它不是左值(不可能赋值)。那么为什么会有错误?

我错过了什么吗?

修改

php版本是5.5.9

这与链接方法无关,这是解析错误,而不是运行时错误。

1 个答案:

答案 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这样的代码都是无法解析的,但它有合法的用途好的代码,所以解析器已得到修复,以便工作。