“$foo = 5 && $bar = 15”是如何求值的,为什么不是错误?

How is "$foo = 5 && $bar = 15" evaluated, and why is it not a error?

假设我们有这样一个简单的代码:

// $foo and $bar aren't defined before

$foo = 5 && $bar = 15;

// var_dump()
// $foo is (bool) TRUE
// $bar is (int) 15

所以我假设它的工作原理如下:

$foo = (5 && ($bar = 15))

但在我看来应该是:

$foo = ((5 && $bar) = 15) // should throw syntax error due FALSE = 15
  1. 评估表从左到右[$foo 想要 5 但 && 更高]
  2. && 获得最高优先级 [所以 && 需要 5 和 $bar]
    • 5 == 真; $bar == Undefined [所以它是 NULL == FALSE]
  3. = 获得了正确的关联性 [等待 (5 && $bar) 的评估]

请用最简单的方式(在其他一些例子上)向像我这样的穷人解释一下。问候。

让我们剖析你的代码行:

 $foo = 5 && $bar = 15;

首先我想指出 = 是一个赋值运算符,通常 return 为真。

话虽这么说,这细分如下:

$foo = (5 && ($bar = 15))
$foo = (5 && (true))
$foo = ( (true) && (true) )
$foo = (true)
$foo = true

&& 代表 AND 并比较两个布尔值,return如果两者都为真则为真,否则为假。请注意,$bar = 15 的赋值将 return 为真,在 5 的情况下,非零整数也将 return 为真。

我认为阅读此处的手册页有助于清除很多内容。

那么这是如何评估的?

$foo = 5 && $bar = 15;

首先你要知道&&的优先级高于=。所以第一个想到的是:

$foo = (5 && $bar) = 15;

但现在是你必须阅读手册直到最后的时刻:http://php.net/manual/en/language.operators.precedence.php

引自那里:

Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.

这是什么意思?

它默默地将 15 分配给 $bar 例如

$foo = (5 && ($bar = 15));

现在您可以计算 &&$bar 赋值为 15,5 && 15 为 TRUE,并且赋值为 $foo