How does “do something OR DIE()” work in PHP?
我正在编写一个 php 应用程序来访问 MySQL 数据库,在教程中,它说的形式是
PHP 是如何知道函数失败以便运行 die 部分的?我想我在问它的??”或”部分是如何工作的。我不认为我以前见过它。
- 顺便说一句,不要在实际应用中使用这种逻辑。我仍然惊讶于有多少教程这样做。
-
为什么不使用它?它真的很好看,可读…
-
这可能很简单并且适合教程,但您不希望您的脚本在真实用户面前出现类似错误消息的情况下不正常地死掉。显示自定义错误页面(不指定实际错误!)记录错误是必须的。
-
不过,您可能仍然可以使用这种技术来做到这一点。
-
不是真的……杀死脚本不会让你继续
-
我说的是”或”,而不是”死”。
-
mysql_connect($host, $user, $pass) 或 PrintNiceError(//’DatabsaeConnectionError//’);
如果第一条语句返回true,那么整个语句必须是true,因此第二部分永远不会执行。
例如:
1 2 3 4 5 6
|
$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 甚至是一种好习惯吗?
-
@BrassApparatus 现在,5 年后再看我的评论,我想说 or 捷径毕竟还不错,它简单、简洁、优雅。但是当它们可能仍然不成立时,将评估视为理所当然的危险而不是最右边的表达式。 (我想说一个好的做法是永远不要将产生副作用的东西用作表达式,例如)在或快捷方式有效的每种情况下,经典的 if 也可以。我每次都建议不要使用 die(),应该优雅地处理错误情况。
-
AND 运算符的工作原理类似,但在这种情况下,如果第一个返回 FALSE,则第二个运算符将永远不会执行
PHP 的 or 像 C 的 || 一样工作(顺便说一下,PHP 也支持它 – or 看起来更好,并且具有不同的运算符优先级 – 请参阅此页面)。
它被称为短路运算符,因为一旦它有足够的信息来决定最终值,它将跳过任何评估。
在您的示例中,如果 mysql_connect() 返回 TRUE,则 PHP 已经知道无论 die() 评估为什么,整个语句都将评估为 TRUE,因此不会评估 die()。
如果 mysql_connect() 返回 FALSE,PHP 不知道整个语句将评估为 TRUE 还是 FALSE,因此它会继续并尝试评估 die() – 结束进程中的脚本。
这只是一个利用 or 工作方式的好技巧。
-
1 用于命名短路。也可能命名为”副作用”。我们对 die() 返回代码根本不感兴趣,我们只想要它的执行效果。 (它并不总是死())。这并不总是受到纯粹主义者的欢迎,因为有些效果可能是模糊的。
-
这还不是全部。你也可以使用和组合一些东西,你希望一件事在做第二件事之前肯定有效。
它像其他人描述的那样工作。
在 PHP 中,不要使用”die”,因为它不会引发异常(就像在 Perl 中那样)。而是以正常方式正确抛出异常。
die 不能在 PHP 中被捕获,并且不记录 – 相反,它不优雅地打印消息并立即退出脚本,而不告诉任何人任何事情或给你任何机会记录事件,重试等。
1 2 3 4 5 6 7 8 9
|
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
die("could not connect");
}
else
{
echo"Connected";
}
|
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/php/268508.html