我试图回答为什么这段代码是一个无限循环?
在那里我认为问题可能是因为操作优先级,但是当我检查http://php.net/manual/en/language.operators.precedence.php时,.
优先级高于=
所以我尝试了以下代码:
$a.$b = "test";
echo $a;
echo $b;
我得到了未定义的变量a
,test
这意味着它正在为 $b 赋值,它是如何为 $b 赋值的(不应该按照操作优先级)
我试图回答为什么这段代码是一个无限循环?
在那里我认为问题可能是因为操作优先级,但是当我检查http://php.net/manual/en/language.operators.precedence.php时,.
优先级高于=
所以我尝试了以下代码:
$a.$b = "test";
echo $a;
echo $b;
我得到了未定义的变量a
,test
这意味着它正在为 $b 赋值,它是如何为 $b 赋值的(不应该按照操作优先级)
这根本不符合逻辑:
($a.$b) = "test"; // you can't assign to the result of an expression
这样做:
$a.($b = "test");
没有比这更深入的内容,我相信 PHP 编译器会像您编写后者一样解释代码,因为“那会起作用”。
PHP 解析器的缺陷“渗透”并对代码产生令人惊讶的影响已经不是第一次了。
更新:原来这不是一个错误,它是一个功能。
我相信答案在文档中明确说明:
尽管 = 的优先级低于大多数其他运算符,但 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"