我如何让PHP避免懒惰评估?

2 php boolean-logic function lazy-evaluation

关于PHP评估布尔表达式的方式,我有一个有趣的问题.例如,当你有

$expression = $expression1 and $expression2;
Run Code Online (Sandbox Code Playgroud)

要么

if ($expression1 and $expression2)
Run Code Online (Sandbox Code Playgroud)

PHP首先检查是否$expression1计算结果true.如果不是这种情况,则$expression2只需跳过以避免不必要的计算.在我写的剧本中,我有:

if ($validator->valid("title") and $validator->valid("text"))
Run Code Online (Sandbox Code Playgroud)

我需要$validator->valid("text")评估第二个语句(),即使第一个语句的计算结果为false.我想问一下,是否有一些简单的方法可以强制PHP始终评估这两个语句.谢谢!

Kal*_*ium 26

$isValidTitle = $validator->valid("title");
$isValidText = $validator->valid("text");
if($isValidTitle && $isValidText)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

那会适合吗?

  • 我喜欢这个解决方案,因为它明确声明方法应该作为代码执行,而不是作为简单的测试.有一些思想学派相信具有副作用的陈述不应该进入控制陈述 - 控制陈述仅用于测试,从不执行. (7认同)

Pao*_*ino 11

这被称为短路评估,为了避免它,您需要使用单个&:

if($validator->valid("title") & $validator->valid("text")) {

}
Run Code Online (Sandbox Code Playgroud)

请注意,这不是使用逻辑运算符,而是实际按位运算符:

它们是作用于数字的二进制表示的运算符.它们不会将逻辑值(即"true"或"false")作为参数,而不先将它们分别转换为数字1和0.它们也不会返回逻辑值,而是返回数字.当然,您可以稍后将这些数字视为逻辑值(在这种情况下,0将转换为"false",其他任何内容都转换为"true"),但这是PHP类型转换规则的结果,并且无关与运营商的行为.

因此,有一些争论至于是否是使用这种副作用规避短路计算好的做法.我个人至少会评论&有意,但如果你想尽可能地纯洁,你应该首先评估它们是否有效然后再做if.

  • 这是非常不明智的.如果第一个返回true,后者返回2. true&2 make false,该怎么办?此外,维护者可能会出现并说"哎呀,应该是&&,而不是&",打破了代码.http://stackoverflow.com/questions/710919/how-can-i-have-php-avoid-lazy-evaluation/710936#710936是​​一个更安全,更清晰的答案. (3认同)