关于PHP评估布尔表达式的方式,我有一个有趣的问题.例如,当你有
$expression = $expression1 and $expression2;
要么
if ($expression1 and $expression2)
PHP首先检查是否$expression1
计算结果true
.如果不是这种情况,则$expression2
只需跳过以避免不必要的计算.在我写的剧本中,我有:
if ($validator->valid("title") and $validator->valid("text"))
我需要$validator->valid("text")
评估第二个语句(),即使第一个语句的计算结果为false.我想问一下,是否有一些简单的方法可以强制PHP始终评估这两个语句.谢谢!
$isValidTitle = $validator->valid("title"); $isValidText = $validator->valid("text"); if($isValidTitle && $isValidText) { ... }
那会适合吗?
这被称为短路评估,为了避免它,您需要使用单个&
:
if($validator->valid("title") & $validator->valid("text")) { }
请注意,这不是使用逻辑运算符,而是实际按位运算符:
它们是作用于数字的二进制表示的运算符.它们不会将逻辑值(即"true"或"false")作为参数,而不先将它们分别转换为数字1和0.它们也不会返回逻辑值,而是返回数字.当然,您可以稍后将这些数字视为逻辑值(在这种情况下,0将转换为"false",其他任何内容都转换为"true"),但这是PHP类型转换规则的结果,并且无关与运营商的行为.
因此,有一些争论至于是否是使用这种副作用规避短路计算好的做法.我个人至少会评论&有意,但如果你想尽可能地纯洁,你应该首先评估它们是否有效然后再做if.