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")即使第一个语句的计算结果为假,我也需要对第二个语句 ( ) 进行评估。我想问你是否有一些简单的方法可以强制 PHP 总是评估这两个语句。谢谢!

4

6 回答 6

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

那会适合吗?

于 2009-04-02T18:12:40.753 回答
9

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

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

}

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

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

因此,对于使用这种副作用来规避短路评估是否是一种好的做法存在一些争论。我个人至少会发表评论说 & 是故意的,但如果你想尽可能纯粹,你应该先评估它们是否有效,然后再做 if。

于 2009-04-02T18:13:55.447 回答
4

尝试分别评估每个术语:

$term1 = $validator->valid("title");
$term2 = $validator->valid("text");
if($term1 && $term2) {
//things to do
}
于 2009-04-02T18:15:38.063 回答
3

这可能不是最好的实现,但你总是可以这样做:

$a=$validator->valid("title");
$b=$validator->valid("text");
if($a && $b) {...}
于 2009-04-02T18:13:25.947 回答
1

您可以定义如下函数:

function logical_and($x,$y) {return ($x && $y);}

由于 PHP 使用按值调用,因此这是可行的。

于 2010-08-20T10:28:17.347 回答
0

或者,如果您可以修改类 $validator 实例化,则可以使有效方法接受字符串或数组。如果它是一个数组,它会运行每个项目上已经存在的代码,并且只有在所有项目都“有效”时才返回 TRUE。

于 2009-04-02T19:53:16.207 回答