ts.*_*ts. 285 php coding-style operators
我有一个代码库,开发人员决定使用AND
而OR
不是&&
和||
.
我知道运营商的优先级(&&
之前and
)有所不同,但是对于给定的框架(PrestaShop来说准确),显然不是理由.
你使用的是哪个版本?是and
不是更具有可读性&&
?或者没有区别?
Pow*_*ord 639
如果你使用AND
和OR
,你最终会被这样的事情绊倒:
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
Run Code Online (Sandbox Code Playgroud)
想猜猜什么$truthiness
等于?
如果你说false
... bzzzt,对不起,错了!
$truthiness
以上有价值true
.为什么? =
具有更高的优先级比and
.添加括号以显示隐式顺序使得这更清楚:
($truthiness = $this_one) and $that
Run Code Online (Sandbox Code Playgroud)
如果您使用&&
而不是and
在第一个代码示例中,它将按预期工作并且可以false
.
正如下面的评论中所讨论的,这也可以获得正确的值,因为括号的优先级高于=
:
$truthiness = ($this_one and $that)
Run Code Online (Sandbox Code Playgroud)
ada*_*Lev 43
根据它的使用方式,它可能是必要的,甚至是方便的. http://php.net/manual/en/language.operators.logical.php
// "||" has a greater precedence than "or"
// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;
// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;
Run Code Online (Sandbox Code Playgroud)
但在大多数情况下,它似乎更像是一个开发人员喜欢的东西,就像我在CodeIgniter框架中看到的每次出现的那样,如@Sarfraz所提到的.
Cap*_*chi 11
为了安全起见,我总是将我的比较括起来并将它们分开.这样,我不必依赖运算符优先级:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
Run Code Online (Sandbox Code Playgroud)
优先级之间不同&&和和(&&的优先级高于与),东西时,与三元运算符组合引起的混乱.例如,
$predA && $predB ? "foo" : "bar"
Run Code Online (Sandbox Code Playgroud)
将返回一个字符串而
$predA and $predB ? "foo" : "bar"
Run Code Online (Sandbox Code Playgroud)
将返回一个布尔值.
由于and
优先级低于=
您在条件赋值中使用它的优先级:
if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false
Run Code Online (Sandbox Code Playgroud)