【问题标题】:Does PHP have non-short-circuting comparison operators?PHP 是否有非短路比较运算符?
【发布时间】: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


【解决方案1】:

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

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

编辑:

我可以想出一种解决方法,而不是 &&,我可以使用乘法 * 并转换为布尔值:

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

【讨论】:

  • 我遇到的代码没有问题;这是关于语言本身的问题
【解决方案2】:

没有用于此目的的专用运算符,但您可以选择做这样的怪事(假设 do_foo($f) 总是返回一个布尔值:

$success &= do_foo($f);

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

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

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

推荐

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

【讨论】:

  • 您的第一个选项不会返回布尔值,即使“操作数”都是布尔值。
  • @nl-x 是的,但它会评估为true;也许这可以更明显:)
  • 我将此标记为答案,因为直到有人反驳你,说“没有专门的操作员为此目的”才能满足问题。
猜你喜欢
  • 2011-08-04
  • 2011-03-07
  • 2013-06-24
  • 1970-01-01
  • 2020-05-09
  • 2014-12-01
  • 2014-05-31
  • 2015-12-23
  • 1970-01-01
相关资源
最近更新 更多