PHP5 - 赋值操作结果未被解析器视为对象
PHP5 - Assignment operation result not treated as object by parser
我对解析错误有点困惑:
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 的 "hand crafted parser" 有 严重的 限制,尤其是在 PHP < 7.0。很多您期望有效的复杂表达式,却没有。
但至少它保持了它自己的怪异 "symmetry":正如它不适用于将 ->
运算符应用于赋值的结果一样,它也不适用于应用数组索引运算符 [...]
.
例如(在 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
这样的代码也是 unparse-able,但它在好的代码中有合法用途,因此解析器已修复以使其正常工作。
我对解析错误有点困惑:
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 的 "hand crafted parser" 有 严重的 限制,尤其是在 PHP < 7.0。很多您期望有效的复杂表达式,却没有。
但至少它保持了它自己的怪异 "symmetry":正如它不适用于将 ->
运算符应用于赋值的结果一样,它也不适用于应用数组索引运算符 [...]
.
例如(在 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
这样的代码也是 unparse-able,但它在好的代码中有合法用途,因此解析器已修复以使其正常工作。