当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我如何让PHP避免懒惰评估?》经验,为你挑选了2个好方法。

关于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始终评估这两个语句.谢谢!



1> Kalium..:
$isValidTitle = $validator->valid("title");
$isValidText = $validator->valid("text");
if($isValidTitle && $isValidText)
{
    ...
}

那会适合吗?


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

2> Paolo Bergan..:

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

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

}

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

它们是作用于数字的二进制表示的运算符.它们不会将逻辑值(即"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是​​一个更安全,更清晰的答案.
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有