【问题标题】:logical vs assignment operator precedence in PHPPHP中的逻辑与赋值运算符优先级
【发布时间】:2018-09-28 10:12:56
【问题描述】:

最近我遇到了这样的sn-p:

$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;

产生输出1:3。 通过查看运算符precedence sheet,我发现逻辑运算符||&& 的优先级高于赋值运算符=。所以第一个表达式应该被评估为$x = (2 && $y) = 3;,它变成$x = (2 && null) = 3;,最后评估为$x = false = 3;其次-赋值运算符具有正确的关联性,所以解释器应该尝试执行false = 3,这当然是非法的。所以在我看来,上面提到的代码 sn-p 根本不应该编译,必须抛出解析或运行时错误。但不是该脚本产生 1:3。这意味着解释器执行的操作是:

a) $y=3

b) 2 && $y

c) $x = (2 && $y)

为什么是这样而不是根据运算符优先级?

【问题讨论】:

  • 你不能赋值给一个表达式,所以分组(2 && $y) = 3没有意义。
  • 所以如果某些表达式没有意义 - 我们应该改变运算符优先级以便能够从表达式中提取一些意义?如果动态更改的优先规则与开发人员的意图相反怎么办?我只能同意,如果某些表达式根本没有意义 - 不要运行它或使其崩溃。
  • ¯\_(ツ)_/¯ 那是你的 PHP...

标签: php operator-precedence


【解决方案1】:

operator precedence sheet 作为单独的注释链接到状态:

虽然 = 的优先级低于大多数其他运算符,但 PHP 会 仍然允许类似于以下的表达式: if (!$a = foo()), in 这种情况下 foo() 的返回值被放入 $a 中。

因此,实际上,表达式内的赋值将被视为有点像子表达式。文档中并不清楚这将如何以及何时发生,该文档只是指出“similar”表达式将以这种方式工作。

【讨论】:

  • Aron Cederholm 是正确的,表达式将被分解为子表达式并进行相应的评估。这是由 PHP 语法定义的顺序决定的。以See here 为例。
  • 谢谢,我错过了那个神秘的音符。这意味着从现在开始我不能再信任运算符优先规则了。
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2017-06-20
  • 2012-02-12
  • 2018-12-15
相关资源
最近更新 更多