PHP是否有非短路比较运算符?

时间:2014-06-10 14:39:16

标签: php operators short-circuiting

我最近遇到了一些代码中的错误,其中一系列函数调用被聚合到一个成功条件中。像

这样的东西
$success = true;
foreach($foo as $f) {
   $success = $success && do_foo($f);
}

错误是do_foo()旨在在整个集合中运行(它有副作用)。但&&运算符short-circuts,一旦遇到false,就不会在集合的其余部分调用do_foo。很容易重构,但它让我想知道:

PHP是否有一个不会短路的逻辑运算符?

编辑:让我说清楚,我不是在问如何解决这个问题。这是一个关于语法的假设性问题。

2 个答案:

答案 0 :(得分:2)

你为什么需要它?就这样做:

$success = true;
foreach($foo as $f) {
   $foo_done = do_foo($f);
   $success = $success && $foo_done;
}

修改

我可以想到一个工作,而不是&&我可以使用乘法*并转换为布尔值:

$success = (bool)($success * do_foo($f));

答案 1 :(得分:0)

没有专门的操作符用于此目的,但您可以选择执行这样的重要操作(假设do_foo($f)总是返回一个布尔值:

$success &= do_foo($f);

结果将是数字0或1而不是布尔值,但在条件中使用时它应该无关紧要。

如果函数并不总是返回布尔值,或者上面的内容太令人不安:

$success = (bool)($success & do_foo($f));

建议

那就是说,do_foo($f)应该无条件地运行,并且它的返回值在下一个语句中使用。