我有一个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。