【问题标题】:PHP5 - Assignment operation result not treated as object by parserPHP5 - 解析器不将赋值操作结果视为对象
【发布时间】:2017-06-18 05:46:40
【问题描述】:

我对解析错误有点困惑:

class Foo{
    public function some_function(){}        
}

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

产量

PHP 解析错误:语法错误,意外 '->' (T_OBJECT_OPERATOR),需要 ',' 或 ';'

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

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

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

我错过了什么吗?

编辑

php版本为5.5.9

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

【问题讨论】:

  • 你的编译器使用什么php版本?
  • php 版本丢失。 5.3 我想?
  • php版本为5.5.9
  • eval 显示即使在 php5.6 上也会发生错误
  • 该问题已在 PHP 7 中解决。

标签: php parsing syntax assignment-operator


【解决方案1】:

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


长答案: PHP 的“手工解析器”有严重限制,尤其是在 PHP

但它至少保持了自己奇怪的“对称性”:就像它不适用于将 -> 运算符应用于赋值结果一样,它也不适用于应用数组索引运算符 @987654322 @。

例如(在 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 这样的代码也无法解析,但它在好的代码中具有合法用途,所以解析器已修复以使其正常工作。

【讨论】:

  • 好吧,基本上,php 解析器甚至不符合语言规范。这当然不会改善我对 php 的看法。
  • @Bastien 同意。人们不选择使用“php 作为语言”,而是选择使用“php 作为平台”,虽然语言很可怕。所有关于其创建者的“不共享任何内容,每个请求 1 个进程”的想法。你可以让一群糟糕的开发人员使用存在内存泄漏的库编写错误代码,并且仍然可以发布一个工作应用程序,该应用程序可以在为无数用户提供服务的数十台服务器上轻松扩展(“这是一个错误,但它只崩溃 0.01% 的魔力”客户不关心的请求,资金不断流动” - 使用 nodejs 或 go,您通常会遇到一个错误导致整个应用程序瘫痪)
  • @Bastien 但作为一名开发人员,我上面提到的只会转化为“更差的报酬”和“更多的压力”,除非你有清理其他人代码混乱的不自然的天赋:)
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
相关资源
最近更新 更多