【发布时间】:2014-07-31 09:13:22
【问题描述】:
我最近在工作中的一些代码中遇到了一个错误,其中一系列函数调用被聚合成一个成功条件。类似的东西
$success = true;
foreach($foo as $f) {
$success = $success && do_foo($f);
}
错误是 do_foo() 旨在运行整个集合(它有副作用)。但是 && 运算符是短路的,一旦遇到 false,就不会在集合的其余部分调用 do_foo。很容易重构,但它让我想知道:
PHP 有没有不短路的逻辑运算符?
编辑:让我明确一点,我不是在问如何解决这个错误。这是一个关于语法的假设问题。
【问题讨论】:
-
在一些有限的测试中,我发现按位运算符 (&, |) 在这种情况下可以正常工作,类似于其他语言。但由于 PHP 在类型杂耍和non-transitive operators 方面的怪异,我并不满意。
-
在这种情况下将
do_foo()放在首位是否有意义? -
简而言之:不,PHP 没有非短路逻辑运算符,因为即使使用短路运算符,您也始终可以编写按预期工作的代码(只需将
do_foo放在首位) ),为什么有两组运算符来处理这种有限的边缘情况? -
短路逻辑运算符是代码的基本优化之一。我无法想象 PHP 有意识地让他们的代码变慢,因为它必须经过所有逻辑操作而不必这样做
标签: php operators short-circuiting