我有一个执行此操作的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。
答案 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。