PHP中的or运算符的行为
  我试图了解or操作员的行为。  请看下面的例子: 
$e = false || true;
var_dump($e);
  输出如预期: bool(true); 
$f = false or true;
var_dump($f);
  输出如预期: bool(false) 。  我以某种方式理解了这一点,即=具有比Or更高的优先级,所以这就是$f被赋予false 。 
  但下面的代码与我的想法完全相反。  我认为$foo将被分配到5 ,然后与自身进行比较。  但是$foo只有在$foo被设置的情况下才会被赋值,这意味着它正在检查$foo是否被赋值给任何事物,赋值为5。 
$foo or $foo = 5; 
任何人都可以解释为什么这样吗?
基础:
赋值表达式导致赋值。
  那是什么意思?  $foo = 'bar'是一个表达式,其中赋值操作符=赋值。  表达式总是返回一个值本身。  就像表达式1 + 2导致值3 ,表达式$foo = 'bar'结果是值'bar' 。  这就是为什么这会起作用: 
$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
  布尔操作是短路操作。  如果不需要,双方并不总是被评估。 true || false  true || false总是true ,因为左手操作数是true ,所以整个表达式必须是true 。  这里甚至没有评估false 。 
运算符优先级决定了表达式的哪些部分被分组到子表达式中。 较高优先级的运算符在低优先级运算符之前与其操作数分组。
因此:
$e = false || true;
 false || true  false || true正在被评估,这导致值为true ,它被分配给$e 。  ||  运算符具有比=更高的优先级,因此false || true  false || true被分组到一个表达式中(而不是($e = false) || true )。 
$f = false or true;
  现在or具有比=更低的优先级,这意味着赋值操作在之前or之前被分组为一个表达式。  所以首先计算$f = false表达式,其结果是false (见上文)。  那么你有简单的表达式false or true ,接下来会评估它,结果是true ,但没有人关心。 
评估工作如下:
1. $f = false or true;
2. ($f = false) or true;  // precedence grouping
3. false or true;         // evaluation of left side ($f is now false)
4. true;                  // result
现在:
$foo or $foo = 5; 
  在这里, $foo = 5又具有更高的优先级,并被视为一个表达式。  由于它出现在or运算符的右侧,因此只在必要时评估表达式。  这取决于$foo最初是什么。  如果$foo为true ,则根本不会评估右侧,因为true or ($foo = 5)必须全部为true 。  如果$foo最初有一个虚假值,则评估右侧,并将5分配给$foo ,结果为5 ,这就是true-ish,这意味着总体表达式是true ,这是没有人关心的。 
1. $foo or $foo = 5;
2. $foo or ($foo = 5);   // precedence grouping
3. false or ($foo = 5);  // evaluation of left side
4. false or 5;           // evaluation of right side ($foo is now 5)
5. true;                 // result
根据有关逻辑运算符的php.net网页:
这个:
$e = false || true;
像这样的行为:
$e = (false || true) // If false is true, then $e = false. Otherwise true
这个:
$f = false or true;
将采取这样的行动:
($f = false) or true; // $f = false is true, as the assignment succeeded
这个:
$foo or $foo = 5; 
将采取这样的行动:
$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5
对于最后一个,未定义基本上是假的,因此foo等于5。
另外,这里是运算符优先顺序的链接:http://www.php.net/manual/en/language.operators.precedence.php
更新:
好的,现在我们来谈谈主要观点。 就像我们在使用提取查询时所知道的一样:
while($row = @mysql_fetch_assoc($result))
  我们都知道while循环只能在true执行,因此$row = @mysql_fetch_assoc($result)返回true。 
与Daric的问题一样。
$foo or $foo = 5;
基本上是:
$foo or ($foo = 5);
基本上是:
$foo = undefined or ($foo = 5); // $foo = 5 actually returns true
这也是
$foo = undefined or true;
正如我之前提到的,undefined = false,所以因此$ foo = 5(因为这是真正的声明)。
我希望每个人都能理解。
$foo or $foo = 5;
Suppose let say $foo=true or $foo=5;
这里它不会评估后面或运算符expresion,所以输出将是$ foo = 1现在表达式是
 $foo=false or $foo=5; 
  在这里,它将评估之后或as =更高的优先级,所以$foo作为其中的哪一个将评估$foo=5因此输出将是5但是当我们评估$foo=false or true ,这里它会考虑=更高的优先级,输出将是$foo=false但整个表达式将评估为true,因为false or true会变为false 
上一篇: The behaviour of the or operator in PHP
下一篇: What exactly does
