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

时间:2015-03-19 16:50:51

标签: php if-statement boolean

我有一个执行此操作的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语句中检查第二个条件?

上述解决方案是否仍会返回警告,因为即使在将第一个file_get_contents - 函数评估为FALSE后,PHP仍然运行empty()函数?

我从php.net和其他地方读过的东西似乎只将IF条件评估为单个返回块,因为括号之间的整个块返回TRUE或FALSE而不是PHP如何处理每个子部分IF条件单独返回TRUE或FALSE。

2 个答案:

答案 0 :(得分:4)

  

那么,如果第一个条件返回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,因为函数被调用了,因为第一部分是真的。

修改

如果您想完全接受它,则称为:短路评估

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

从那里引用:

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

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

答案 1 :(得分:0)

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