【问题标题】:Why if/else vs. or/exit in PHP?为什么 if/else vs. or/exit 在 PHP 中?
【发布时间】:2012-07-15 21:28:56
【问题描述】:

看到exit() PHP documentation 让我思考:

$filename = '/path/to/data-file';
$file = fopen($filename, 'r')
or exit("unable to open file ($filename)");

几个问题:

  1. 除了打开文件使用exit()之外,还有哪些常见用例?
  2. 由于并非每个人编写的每个函数都以exit() 结尾,您如何知道在某些情况下使用它还是在其他情况下使用它?
  3. if/elseor/exit 可以互换吗?

【问题讨论】:

  • 他们使用了or exit,因为您正在查看exit 的示例。
  • @Gumbo,我编辑了我的问题以删除您引用的问题#3 中无意义的部分。

标签: php if-statement fopen exit


【解决方案1】:

在这种情况下,该语句中的or 是PHP 的logical operators 之一,当这样使用时,如果且仅当第一个语句由于@ 而失败时,它将执行第二个语句987654322@.

由于 fopen 返回 false,or exit 语句在第一部分失败后被执行。

为了更好地理解它,这里是短路评估的快速解释。

$x = 5;
$y = 42;

if ($x == 5 or $y == 42) {
    echo "x or y is true";
}

在上面的代码中,表达式 $y == 42 永远不会被计算,因为没有必要因为第一个表达式为真。

在该示例中,他们使用相同的逻辑来决定是否评估调用exit 的语句。

解决您的问题:

  1. 除非程序非常具体,否则在打开文件失败时我不会使用 exit。更好的做法是记录错误,然后将错误返回给调用者,以便他们决定要做什么。
  2. 何时使用exit 完全取决于您编写的代码。
  3. 鉴于短路的解释,是的,它们在这个意义上是可以互换的。使用or exit 只是比使用if/else 短一点。

希望对您有所帮助。

【讨论】:

    【解决方案2】:
    1. CLI 脚本,exit 可以采用一个整数参数,该参数反馈到控制台以指示成功或某种形式的错误
    2. 我不倾向于在应用程序代码中使用exit()die(),因为首选异常。但是,我个人认为你可能有点过于复杂了......它会杀死脚本执行,所以当你需要杀死脚本时使用它。老实说,我大多只在调试时(一次性断点)在执行过程中终止脚本,这也不理想(同样,例外情况会更好)。
    3. or 的使用主要是方便。不过,这里有一个有趣的点......

    为什么

    $resource = mysql_connect() || die('dead') 
    

    不工作?

    答案是= 运算符优先于or,因此首先进行赋值,如下所示:($resource = mysql_connect()) or die()。这样一来,就像在做if(!($resource = mysql_connnect())) { die() }

    【讨论】:

      【解决方案3】:

      我倾向于完全避免使用exit(),因为从用户的角度来看,这是一种处理错误的非常丑陋的方式。

      如果你必须使用它,任何不可恢复的错误都是候选者。例如,数据库查询或连接失败,或远程请求失败。

      if/else 等价于...or whatever()。这只是一个风格的东西,后一种形式更简洁。

      【讨论】:

        【解决方案4】:

        如果您执行的功能失败,您的代码将无法继续运行,我会说您使用exit。例如读取需要的文件。

        【讨论】:

        • 根据手册"die — Equivalent to exit"。而exit 描述:Terminates execution of the script. Shutdown functions and object destructors will always be executed even if exit is called.
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 2011-12-25
        • 2018-09-19
        • 1970-01-01
        相关资源
        最近更新 更多