【问题标题】:Why is it assigning value to $b? It should not as per operator precedence rule为什么要为 $b 赋值?它不应该按照运算符优先规则
【发布时间】:2013-07-25 11:49:31
【问题描述】:

我试图回答Why is this code an infinite loop?

我认为问题可能是由于操作优先级,但是当我检查 http://php.net/manual/en/language.operators.precedence.php 时,. 的优先级高于 =

所以我尝试了以下代码:

 $a.$b = "test";

 echo $a;
 echo $b;

我得到未定义的变量atest,这意味着它正在为$b 赋值,它是如何为$b 赋值的(不应该按照操作优先级)

【问题讨论】:

  • 您可以参考有问题的运算符优先规则吗?

标签: php variables operators operator-precedence


【解决方案1】:

我相信答案已经说得很清楚了in the docs

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

Jon's answer 上展开,因为您不能分配给表达式,所以= 具有优先权,并且解释器看到以下语句:

$a.($b = "test");

所以它们变成了两个独立的表达式,每个表达式都有自己的优先级。因此test 被分配给$b

为了证明这一点,添加另一个赋值:

$a = 'my ';
$c = $a.$b = "test";

var_dump($a); // string(3) "my "
var_dump($b); // string(4) "test"
var_dump($c); // string(7) "my test"

【讨论】:

  • 不错的发现。人们不知道的一件事,因为“没有理智的程序员会编写那样的代码,所以不要想它”。 :-) +1
  • 是的,我也在 Who Cares 下提出此类问题。保留给蹩脚的采访或那些想炫耀的人。然而,这是我今天看到的第一个问题,我就被吸引住了。
【解决方案2】:

这没有意义:

($a.$b) = "test"; // you can't assign to the result of an expression

这样做:

$a.($b = "test");

没有比这更深入的内容,我相信 PHP 编译器会像您编写后者一样解释代码,因为“那会起作用”。

这不是 PHP 解析器的缺陷第一次“渗透”并对代码产生惊人的影响。

更新:原来是this is not a bug, it's a feature

【讨论】:

  • 感觉不错,但有语言规范支持吗?
  • @Joe:PHP 没有语言规范,它对所有人都是免费的——这就是我想要表达的。在具有正确语法和规范的语言中,这将是一个编译错误。
  • 那么运算符优先级规则呢?
  • @PrasanthBendra:优先级工作正常,例如printf($a = $b.'foo') 在调用printf 之前将$b.'foo' 分配给$a。我相当有信心,这只是因为 PHP 导致东西崩溃的极端情况之一。
  • + 感谢您的基础。
猜你喜欢
  • 2015-11-14
  • 2019-11-22
  • 1970-01-01
  • 2014-11-14
  • 2011-06-10
  • 2021-02-28
  • 2020-11-22
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多