PHP中的“ OR OR DIE()”如何工作?


99

我正在写一个php应用程序来访问MySQL数据库,在一个教程中,它说的是某种形式

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

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


3
顺便说一句,不要在实际应用中使用这种逻辑。仍然让我惊讶的是,有多少教程做到了。
Eran Galperin

2
为什么不使用它?这真的很好,可读性
很强

11
是的,对于教程可能是简单且合适的,但是您不希望您的脚本因在真实用户面前的错误消息而异常消失。显示自定义错误页面(不指定实际错误!)+记录错误是必须的。
伊兰·加珀林

4
我说的是“或”,而不是“死”。
Artelius

21
mysql_connect($ host,$ user,$ pass)或PrintNiceError('DatabsaeConnectionError');
matpie

Answers:


133

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

例如:

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

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

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


1
很好的解释。PHP的这种“隐式如果”语言结构有点危险,因为您可以拥有一些您认为可以执行但实际上却没有执行的语句,而且看起来不像具有if块那样明显。
Petruza

6
这称为短路评估,并且在PHP以外的其他语言中也很有用。
Griever先生11年

1
顺便说一句,您只能在OR之后使用单个语句。一条语句将无法通过语法检查(例如,实际错误消息可能是Parse错误:语法错误,意外的'{'in ...)
Scott Chu

在这里,我当时以为这是某种高级功能,例如python的with语句,而实际上它只是一个布尔表达式...我认为如果期望在执行此操作的情况下进行清理,则在使用该表达式时应格外小心错误。请纠正我,如果我错了,但是如果您做错了,func_call($file) or die();并且函数失败了,那么在脚本死后该文件将保持打开状态。
pedromanoel 2012年

@Petruza在可行的or情况下使用它甚至是一种好习惯if吗?
limeandcoconut 2015年

32

PHP的or工作方式与C相似||(顺便说一下,PHP也支持它- or看起来更好,并且具有不同的运算符优先级-参见此页)。

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

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

如果mysql_connect()返回FALSE,PHP将不知道整个语句的计算结果是否为TRUE或FALSE,因此它继续进行并尝试求值die()-在此过程中结束脚本。

这只是一个很好的技巧,它利用了工作方式or


+1用于命名短路。可能也被命名为“副作用”。我们对die()返回代码完全不感兴趣,我们只需要执行它的效果即可。(它并不总是成为die())。纯粹主义者并不总是很喜欢这种方法,因为某些效果可能难以理解。
mckenzm

而这还不是全部。您还可以使用并组合东西,在此之前,您希望一件事一定能起作用,然后再做第二件事。
My1

11

正如其他人所描述的那样。

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

die不能在PHP中捕获,也不会登录-而是不友好地打印消息,并立即退出脚本,而无需告知任何人或给您任何机会记录事件,重试等。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.