【问题标题】:PHP handling multiple clauses in an IF statementPHP 处理 IF 语句中的多个子句
【发布时间】:2015-03-19 16:50:51
【问题描述】:

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

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

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

【问题讨论】:

  • 测试一下,你就会发现。 :)
  • @ClémentMalet 非常正确,但我认为这也是 IF 语句动态的一个有趣问题,并且在互联网上的一些搜索发现很少能告诉我原则上的答案。

标签: php if-statement boolean


【解决方案1】:

那么,如果第一个条件返回 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 中你有短路,这在那里非常有用。

【讨论】:

  • 感谢您提供的示例,Rizier。这是我希望得到的答案。所以我希望我的empty() 子句会导致错误日志停止说明警告,因为file_gets_contents 只会在字符串不为空时运行。
  • @Martin 是的!你也可以自己测试一下:D
  • @Rizier123 不要偷懒。添加一行说“这被称为'短路评估'并且在许多语言中普遍用于加速评估过程。”足以让你的答案完整
  • @IsmaelMiguel 我真的看不出你的逻辑——你到维基百科的链接并不特定于 PHP(它有各种 [非布尔] 运算符,它们的行为与其他语言中的预期不太一样) . Rizier 的回答准确地告诉了我我需要知道的内容 :)
  • @Martin 我认为你真的很困惑。 $a &amp;&amp; foo() 如果与 if($a){ foo(); }if($a &amp;&amp; foo()){} 相同。 if 是语言构造函数而不是函数。 PHP 独立解释逻辑运算符,无论它是否在 if 中。如果操作符绑定到if,那么你就不能做$a = $b &amp;&amp; foo();
【解决方案2】:

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

【讨论】:

  • 这个答案不完整。
猜你喜欢
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多