1

我试图回答为什么这段代码是一个无限循环?

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

所以我尝试了以下代码:

 $a.$b = "test";

 echo $a;
 echo $b;

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

4

2 回答 2

3

这根本不符合逻辑:

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

这样做:

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

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

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

更新:原来这不是一个错误,它是一个功能

于 2013-07-25T11:57:36.650 回答
3

我相信答案在文档中明确说明:

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

扩展乔恩的答案,因为您不能分配给表达式,所以=优先级和解释器看到以下语句:

$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"
于 2013-07-25T12:04:39.887 回答