PHP处理IF语句中的多个子句


PHP handling multiple clauses in an IF statement

我有一个php代码可以做到这一点:

if (file_get_contents($businessData['header_image'],0,null,0,1) !== false) {
    $headerBackingImage = $businessData['header_image'];
    }
else {
    $headerBackingImage = "default_image_url.jpg";
}

目的是确定企业在定义的位置是否有有效的图像文件,然后在网页中使用该文件的URL。$businessData是来自数据库的输出的数组。

我发现,对于一些数据库行,$businessData['header_image']值为空,这会引起警告:

PHP警告:file_get_contents():文件名不能为空

很明显,上述语句的前提是检查$businessData['header_image']是否为空。使用PHP empty()函数轻松完成。

可以将其结构如下:

if (!empty($var)){
    if (file_get_contents($var)){
    ///file exists!
    }
else {
    ///file does not exist, use default.
    }
}
else {
        ///file does not exist, use default.
        }

但这意味着在IF EMPTY检查内外重复else子句。

我的问题

那么,这个布局如何维护一个IF{...}语句,而不需要重复ELSE{...}子句:

if (!empty($businessData['header_image']) && file_get_contents($businessData['header_image'],0,null,0,1) !== false){ ... }

那么,如果第一个条件返回FALSE,PHP是否会麻烦检查IF语句中的第二个条件

上面的解决方案是否仍然会返回WARNING,因为即使在将第一个--empty()-函数求值为FALSE之后,PHP仍然运行file_get_contents函数?

我从php.net和其他地方读到的关于这一点的内容似乎只将IF条件作为单个返回块来评估,因为在括号之间的整个块中,返回TRUE或FALSE,而不是php如何单独处理返回TRUE或FALSE的IF条件的每个子部分。

那么,如果第一个条件返回FALSE,PHP会麻烦检查IF语句中的第二个条件吗?

这里没有,如果AND语句的第一部分是flase PHP不关心第二部分。你可以很容易地在这里看到:

<?php
    function func() { echo "HERE!";}
    if(false && func()) {
        echo "yes";
    } else {
        echo "no";
    }
?>

输出:

no

正如您所看到的,您没有得到输出:HERE!。但如果将false改为true,则会得到:HERE!no,因为函数被调用了,因为第一部分是true。

编辑:

如果你想准确地进行,这被称为:短路评估

您可以在这里的手册中看到这一点:http://php.net/manual/en/language.operators.logical.php

还有一句话:

//foo()将永远不会被调用,因为这些操作符是短路

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());

这种行为是可能的,因为PHP是基于C的。在C中,你有短路,这在那里非常有用。

条件从左到右进行解析,如果不需要,则不执行,就像在建议的代码中一样。需要理解的是,如果第一部分为false,则整个块为false,因此整个块也返回false。