PHP如何计算复合if语句


How does PHP evaluate compound if statements?

给定下面嵌套的if语句:

if(file_exists($fullPathToSomeFile)) {
    if(is_readable($fullPathToSomeFile)) {
        include($fullPathToSomeFile);
    }
}

这与

有什么不同?
if(file_exists($fullPathToSomeFile) &&  is_readable($fullPathToSomeFile)) {
    include($fullPathToSomeFile);
}

具体来说,我想知道如果$fullPathToSomeFile不存在(第一个条件失败),PHP将如何处理is_readable()。

在某些时候,我开始嵌套这些,因为使用单行版本在某些条件下会抛出错误。在我看来,使用任何'and'将要求PHP评估所有内容,而不管true/false结果。

我真正想要的是当它到达第一个false时停止计算,从而在条件失败时防止警告或致命错误。嵌套的(第一个例子)保证了这一点,但是嵌套的if语句更难阅读和维护。

当前处理此问题的最佳实践是什么?

具体来说,我想知道如果$fullPathToSomeFile不存在(第一个条件失败),PHP将如何处理is_readable()。

PHP对&&运算符使用短路求值。也就是说,如果像if (A && B)这样的表达式中的第一个条件失败,很明显整个条件将为假。因此,第二个条件B不需要求值来确定结果,而且根本不需要求值。

以以下代码为例:

<?php
  function hey()
  {
    echo "Hey there!'n";
    return true;
  }
  if (false && hey())
  {
    echo "Statement evaluated to true.'n";
  }
  else
  {
    echo "Statement evaluated to false.'n";
  }
?>

这将只回显一行("Statement evaluate to false."),但不会回显"Hey there!",因为if条件的第二部分不会被求值。