PHP5 - 赋值运算结果不被解析器视为对象

标签 php parsing syntax assignment-operator

我对解析错误有点困惑:

class Foo{
    public function some_function(){}        
}

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

产量

PHP Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ';'

以下是 php-langspec 关于简单赋值表达式的说明:

The type and value of the result is the type and value of the left-hand operand after the store (if any [see below]) has taken place. The result is not an lvalue.

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

我错过了什么吗?

编辑

php版本是5.5.9

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

最佳答案

简短回答:这些表达式现在在 PHP 7.x 中可以正常工作。耶!


长答案: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无法解析,但它在良好的代码中具有合法用途,因此解析器已修复以使其正常工作。

关于PHP5 - 赋值运算结果不被解析器视为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41980469/

相关文章:

php - 使用 MySQL 或 ElasticSearch 进行搜索

c# - FROM close 中的语法错误?

mysql - 计划事件 Mysql 不接受语法 BEGIN END

css - 嵌套 CSS 规则是否有效?

php - 使用存储过程和 PHP 插入?

php - Objective-c 使用脚本上传到数据库

php - Symfony 2 依赖注入(inject)和 Autowiring

Java SyndFeedInput 解析提要

java - 如何将 XML 文档导出到文件系统

java - 使用 JSoup 解析特定元素