【问题标题】:Operator precedence of ?? operator?? 的运算符优先级操作员
【发布时间】:2021-10-26 23:08:18
【问题描述】:

我对 PHP 的优先级有点困惑??运算符。

https://www.php.net/manual/en/language.operators.precedence.php 表示它的优先级低于 /(除)运算符。如果这是真的,$a??1/0 应该总是给出错误,不仅当$aNull,因为它首先评估1/0。由于它没有给出“除以零”错误,我假设?? 运算符的两侧被评估为两个不同的表达式,第二个仅在第一个产生Null 时才被评估。虽然以这种方式实现它绝对有意义,但这是否与上页所述的优先级相矛盾?

【问题讨论】:

  • Manual 判断?? 完全按照它应该的方式工作。看看?? 翻译成什么,你就会明白为什么当$a 不为空时它不会出错
  • / 确实具有优先权,但肯定会给予($a) or (error) - 这就是您在帖子后半部分所说的,并且与优先权不矛盾。它只是在is $a null 部分之前执行1/0 部分。
  • 我很清楚 如何 评估这两个表达式。我的问题源于这样一个事实,即这种评估顺序(对我而言)似乎与规定的运算符优先级相矛盾。

标签: php


【解决方案1】:

null 合并?? 运算符将评估表达式的右侧部分如果左侧部分为 Null。 这意味着它将首先评估左侧部分,以便知道是否值得评估右侧部分。 将此视为对解释器的优化,以防止在某些代码未到达时执行它,并且看起来不像运算符优先级问题。

同样在if语句中,当if(expression=true)时,后面的elseif不会被求值。

参考您在问题中提供的链接,在编码时考虑以下事项:

使用括号,即使不是绝对必要,也经常可以 通过明确分组而不是增加代码的可读性 而不是依赖隐式运算符优先级和关联性。

你提供的例子

<?php

//$a=12;
$a=Null;
echo $a??1/0;

真的会被解析为:

<?php

//$a=12;
$a=Null;
echo ($a) ?? (1/0) ;

额外的括号将防止下一个处理您的代码的开发人员出错。

【讨论】:

  • 我明白这一切,这基本上就是我所说的:“虽然以这种方式实现它绝对有意义,”(即将它评估为两个不同的表达式(并且只有第二个,如果首先给出“False”))我的问题确实在句子的第二部分:“这不与上页所述的优先级相矛盾吗?”
  • 不,这并不矛盾。除法运算符接管空合并运算符。这就是为什么 1/0 被评估为一个表达式,而 $a 被评估为另一个。在 php 文档中:The precedence of an operator specifies how "tightly" it binds two expressions together。运算符的优先级不定义表达式的计算顺序。
  • 1 是“表达式”,0 是另一个,运算符 / 接管 ??运算符,因此 1/0 将成为要评估的新表达式。在这种情况下, / 对 ?? 没有影响。运算符,只有在满足他的规则时才会考虑评估“1/0”($a=Null)。
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 2011-07-07
  • 1970-01-01
  • 2015-03-20
  • 2015-11-17
  • 2021-10-25
相关资源
最近更新 更多