【问题标题】:How does "do something OR DIE()" work in PHP?“做某事或死()”如何在 PHP 中工作?
【发布时间】:2010-09-30 18:05:23
【问题描述】:

我正在编写一个 php 应用程序来访问 MySQL 数据库,并且在一个教程中,它说了一些形式

mysql_connect($host, $user, $pass) or die("could not connect");

PHP 是如何知道函数失败以便运行 die 部分的?我想我在问它的​​“或”部分是如何工作的。我想我以前没见过。

【问题讨论】:

  • 顺便说一句,在实际应用中不要使用这种逻辑。我仍然惊讶于有多少教程这样做。
  • 为什么不用它呢?它真的很好读……
  • 这可能很简单并且适合用于教程,但是您不希望您的脚本在真实用户面前出现类似错误消息的情况下不优雅地死掉。显示自定义错误页面(不指定实际错误!)+记录错误是必须的。
  • 我说的是“或”,而不是“死”。
  • mysql_connect($host, $user, $pass) 或 PrintNiceError('DatabsaeConnectionError');

标签: php mysql exception-handling conditional


【解决方案1】:

如果第一条语句返回true,那么整个语句必须是true,因此第二部分永远不会执行。

例如:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

因此,如果您的查询不成功,它将评估die() 语句并结束脚本。

【讨论】:

  • 很好的解释。 PHP 的这种“隐含 if”语言结构有点危险,因为你可以有一些你认为会执行但实际上没有执行的语句,这不像你有一个 if 块那么明显。
  • 这称为短路评估,在 PHP 以外的语言中也很有用。
  • 顺便说一句,OR 后面只能使用单个语句。块语句将无法通过语法检查(例如,实际错误消息可能是 Parse error: syntax error, unexpected '{' in ...)
  • 在这里,我认为这是某种高级功能,例如 python 的 with 语句,但实际上它只是一个布尔表达式...我认为在使用此表达式时应格外小心,如果如果出现错误,您应该执行清理。如果我错了,请纠正我,但如果你这样做 func_call($file) or die(); 并且函数失败,那么当脚本终止时文件将保持打开状态。
  • @Petruza 在if 可以工作的情况下使用or 是否是一种好习惯?
【解决方案2】:

PHP 的 or 的工作方式类似于 C 的 ||(顺便提一下,PHP 也支持 - or 只是看起来更好,而且具有不同的运算符优先级 - 请参阅 this page)。

它被称为short-circuit 运算符,因为一旦它有足够的信息来决定最终值,它将跳过任何评估。

在您的示例中,如果 mysql_connect() 返回 TRUE,则 PHP 已经知道无论 die() 评估为什么,整个语句都会评估为 TRUE,因此不会评估 die()

如果mysql_connect() 返回 FALSE,PHP 不知道整个语句将评估为 TRUE 还是 FALSE,因此它会继续并尝试评估 die() - 结束进程中的脚本。

这只是一个利用 or 工作方式的好技巧。

【讨论】:

  • +1 用于命名短路。也可能命名为“副作用”。我们对 die() 返回代码根本不感兴趣,我们只想要它的执行效果。 (它并不总是死())。这并不总是受到纯粹主义者的欢迎,因为有些效果可能是模糊的。
  • 这还不是全部。你也可以使用和组合一些东西,你希望一件事在做第二件事之前绝对有效。
【解决方案3】:

它像其他人描述的那样工作。

在 PHP 中,不要使用“die”,因为它不会引发异常(就像在 Perl 中那样)。而是以正常方式正确抛出异常。

die 不能在 PHP 中被捕获,并且不记录 - 相反,它不优雅地打印消息并立即退出脚本,而不告诉任何人任何事情或给你任何机会记录事件、重试等。

【讨论】:

    【解决方案4】:
    $con=mysql_connect($host, $user, $pass)
    if(!$con)
    {
         die("could not connect");
    }
    else
    {
         echo "Connected";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2015-10-11
      • 1970-01-01
      • 2011-10-23
      相关资源
      最近更新 更多