在PHP中带有OR的IF语句中,如何跟踪哪个条件的计算结果为false?

在PHP中带有OR的IF语句中,如何跟踪哪个条件的计算结果为false?,php,codeigniter,Php,Codeigniter,例如,在如下PHP代码中: if($this->function1() && $this->function2()) { //everything is alright } else { //function1 or function2 returned false //whodunnit? } 是否有一种语言结构或其他东西可以帮助我找出else块中的罪魁祸首?我不想再次运行条件,只是为了找出哪里出了问题 请容忍我的伪代码。我的实际代码在这里看起来完全脱

例如,在如下PHP代码中:

if($this->function1() && $this->function2())
{
  //everything is alright
}
else
{
  //function1 or function2 returned false
  //whodunnit?
}
是否有一种语言结构或其他东西可以帮助我找出else块中的罪魁祸首?我不想再次运行条件,只是为了找出哪里出了问题

请容忍我的伪代码。我的实际代码在这里看起来完全脱离上下文。。。顺便说一下,我用的是CodeIgniter

if($this->function1()) {
    if($this->function2()) {
        // both worked
    } else {
        // function1 returned a true value
        // function2 returned a false value
    }
} else {
    // function1 returned a false value
    // (you could optionally call $this->function2() here)
}
或者,如果您始终希望同时运行这两个函数:

$result1 = $this->function1();
$result2 = $this->function2();
if($result1 && $result2) {
    // everything is okay
} else {
    // look at the results to figure out what to do
}
或者,如果要执行第一个但没有两级缩进的操作:

if(!$this->function1()) {
    // function1 returned false
    // (you can call $this->function2() here if you want)
} elseif (!$this->function2()) {
    // function2 returned false
} else {
    // everything is okay
}

最简单的解决方案:将两个函数的结果存储在变量中,并在if条件下检查它们。

您可以在
if
本身中使用临时变量:

if ($f1=$this->function1() and $f2=$this->function2()) {
然后稍后检查它们

注意,我用
替换了
&&
,以避免额外的括号()

我想使用导致错误的函数的名称

这有点难看。我不会用它(“为了这个目的”)。
而且我做这个CW是为了避免投反对票

 if ($this->function1($failed="func1") && $this->function2(.., $failed="func2")) {
    ...
 }
 else {
    print $failed;
这种语法上的变通方法要求您可以用所需的数字填充methods参数,并在未使用的位置传递伪
$failed
参数。实际上,它只是将这个变量添加到局部变量范围中

您可以更笨拙地重新设计这个if语句,使用更多的&&and和()参数来达到相同的效果。这只是有点紧凑。然而,我不确定我是否理解为什么你想要一个带有失败函数名的字符串,而不仅仅是一个布尔值,或者
if
恐惧症是怎么回事

try{
    functionA();
    functionB();
}catch(YourExceptionType $e){
    //use $e to know what, where, and why it happened
}
那就是我要做的

如果您没有抛出异常,您可以使用“or”,因为当函数为true时,or的第二部分将永远不会运行:

functionA() or somethingWentWrong();
functionB() or somethingWentWrong();


但我仍然推荐try/catch

+1作为优雅的解决方案(不需要任何额外的变量空间),我当然不会称之为“优雅”,但这不是Amber的错+谢谢你的回答,但是我想避免嵌套IF语句。随着每一层的下沉,压痕变得太多。。。在第二种解决方案中,我们讨论的是再次检查if语句中的$result1和$result2(一起或分别在两行中)。。。没有办法避免这种情况吗?@aditya:这种语言(或者说,任何C语言)的语法都没有内置任何东西,没有。你可以用这里提到的变量和其他答案来绕过它。@aditya请参阅我编辑的第三个选项,以获得只使用1个缩进级别的方法。@mario:关于你的最后一段,这很容易出错,而且根本不需要自我记录。把括号放进去。谢谢你花时间回答。。。但是PHP中是否没有内置的东西(我并不坚持应该有,PHP架构师显然离我的知识水平相差数千光年),可以简单地跟踪并告诉我是谁,$f1或$f2导致了“错误”的评估,而不必写更多的if语句?@aditya menon:嗯。您希望如何利用这些信息?如果不是以变量的形式出现,您希望它如何出现?@aditya:我不会过分赞扬PHP架构师。@aditya:一个滑坡,我的朋友!好的测试用例,好的问题。你把它剥光了,我真是个赞美的奴隶。感谢你清晨温暖而模糊的感觉:)罗伯特,有时间的话,请查看我对上面类似答案的评论,谢谢。我明白你为什么创建这个社区维基了。。。LOL;)(反正也不打算-1)现在我想起来了,不确定这个短片是否管用。哈哈哈,我现在不能留下一个-1了,太有趣了。函数调用包含正确的子表达式。马里奥:如果我是你,我不会。使用
$f
的第一个解决方案更干净。我无法想象未来的开发者要花多少时间才能理解这一点。谢谢你的热情。我真的很喜欢第二个解决方案,因为它具有极好的可读性。try/catch也是一个很好的建议。谢谢:)