2013-04-05 74 views
2

今天发现了一些有趣的代码片段。简化的,它看起来像这样:运算符优先级为“or”并且赋值为

$var = null; 

$var or $var = '123'; 

$var or $var = '312'; 

var_dump($var); 

的事情是,因为我知道,precedence of assignment is higher that OR,因此,我认为,应该var_dump输出312(第一 - 分配,第二次 - 在逻辑比较)。但结果是不同的,我得到123(首先 - 检查是否$var转换为true,第二 - 如果没有,分配值)。

问题是它是如何工作的?

为什么行为与or||相同?

回答

3

你可以看到有关此行为的例子Logical Operators

你也可以阅读ARTICAL约Short-circuit evaluation

短路表达x Sand y(用沙表示短路变化)等于条件表达式if x then y else false;表达式x Sor y是等效的alent到if x then true else y

在php中。

return x() and y(); 

等于

if (x()) 
    return (bool)y(); 
else 
    return false; 

return x() or y(); 

等于

if (x()) 
    return true; 
else 
    return (bool)y(); 

所以,这笔交易不仅在优先级。

+1

这很有道理!谢谢!所以,原因是'短路操作者实际上是控制结构而不是简单的算术操作符 – Timur 2013-04-05 14:11:53

3

它一样

$var = null; 

if(!$var)$var = '123'; 
if(!$var)$var = '321'; 

var_dump($var); 
+0

我知道这些都是一样的。我想知道它是如何工作的 – Timur 2013-04-05 14:00:33

+0

它在'or'后面执行字符串(在你的情况下'$ var ='123';')只有当'或'之前的语句是'empty/false/null/etc ...' – Narek 2013-04-05 14:03:22