PHP中die()和exit()有什么区别?


678

PHP die()exit()函数之间的区别是什么?

我认为两者具有相同的功能,但是我怀疑两者之间是否存在某些差异……这是什么?


2
exit()只是使用数字退出状态来退出程序,而die()将错误消息输出到stderr并以EXIT_FAILURE状态退出。so exit() is exit and die() is also exit :)
Muhammad Shahzad

Answers:


541

没有区别-它们是相同的。

PHP手册exit

注意:此语言构造等效于die()

PHP手册die

此语言构造等效于exit()


17
别名使程序员可以使用一种比较熟悉的别名。我记得退出总比死还好。还有一些人记得死比退出更好。
毛里求斯

28
这个(php.net/manual/en/aliases.php)可能会给出一些解释,为什么两个函数会做同样的事情
Marek Karbarz 09年

86
即使它们执行相同的操作,我通常也会保留die与错误相关的停止以及exit所有其他方案。在阅读代码时似乎更好。
nextgentech

7
抱歉,现在无法复活了,但是至少对我来说... dieexit...起步快得多,exit因为非PHP程序员对它的可读性更高,但die键入时却更快。着急。另外,通过键入方式,我不必改变手的书写位置die
亚历杭德罗·伊万2015年

7
@mauris,一个函数最好只有一个名字会更好。想象每个PHP函数都有两个名称,那将是一团糟
Pacerier,2015年

221

原产地差异

die()和之间的区别exit()是PHP的起源


功能等效

die()exit()等效的功能。

PHP手册

PHP手册die

此语言构造等效于exit()

PHP手册exit

注意:此语言构造等效于die()

PHP 函数别名列表手册:

die 是主函数的别名 exit()


其他语言不同

die()并且在其他语言exit()有所不同,但是在PHP中它们是相同的。

另一个PHP咆哮

...作为C和Perl编码器,我准备回答:“为什么exit()只是以数字退出状态来保全程序,而die()将错误消息输出到stderr并以EXIT_FAILURE状态退出。 ” 但是后来我想起我们处于PHP的混乱语法领域。

在PHP中,exit()和die()是相同的。

设计师显然认为“嗯,让我们从C借用exit()。如果我们也像从Perl一样使用die(), Perl的人们可能会喜欢它。糟糕!我们现在有两个退出函数!让我们使它们都可以将字符串或整数作为参数并使它们相同!”

最终结果是,这实际上并没有使事情变得“更轻松”,只是更加令人困惑。C和Perl编码人员将继续使用exit()仅抛弃一个整数退出值,而die()抛弃一个错误消息并以失败退出。新手和PHP作为第一语言的人们可能会想知道“嗯,两个退出函数,我应该使用哪个?” 该手册没有解释为什么会有exit()和die()。

通常,PHP具有许多这样的怪异冗余-它试图使来自不同语言背景的人变得友好,但是这样做却造成了混乱的冗余。


14
即使这是第100个答案,说明它们是等效的(也可以在我的答案^^中看到),但这确实增加了一些很好的观点。最重要的是,它们在其他语言中是不同的(因此首先造成了混乱)。(+1)
莱维特2015年

@Levit,不,不,您完全错了。没有人拥有名字,不同的语言以不平等的方式重复使用相同的名字。很好,因为我们不需要另一种标准的处理方式。一个“混乱放在首位”是由于PHP分配两个不同的名字,以一个功能..
Pacerier

2
@Pacerier:当然,如果从“是谁的错”的角度来看的话,那是绝对正确的。还有一个事实是,它们只是在几种语言中表示不同的意思(没关系)。从中立的角度来看,它绝对是正确的:由于含义不同,存在混淆(即使创建两个相等的函数别名是php的错)。我绝对不想指责任何一种语言,如果那是您从我的评论中所能理解的...(great xkcd btw(Y)^^)
Levite 2015年

2
这绝对应该是选择的答案,很好的描述!
科迪·布朗

另一个用户回答说exit()并没有关闭连接die(),似乎是相关的。
ner0

62

如前所述,这两个命令产生相同的解析器令牌。

有一个小的区别,那就是解析器返回令牌需要多长时间。

我还没有研究过PHP解析器,但是如果它是一长串以“ d”开头的函数,而又是一短串以“ e”开头的函数,那么查找以“”开头的函数的函数名一定要花些时间e”。由于检查整个函数名称的方式,可能还有其他差异。

我怀疑除非您有一个专门用于解析PHP的“完美”环境以及许多具有不同参数的请求,否则它是否可以衡量。但是一定有区别,毕竟,PHP是一种解释型语言。


4
@Timeless,完美主义者不会说“ PHP是一种解释语言”。PHP是一种可以解释或编译的语言,具体取决于您的服务器设置。
Pacerier,2015年

29
而且...“ die”的长度为3个字符,而“ exit”的长度为4个字符。因此,它减少了25%的内存和文件空间!;)
Jan Derk 2015年

2
“”,如果它是一长串以“ d”开头的函数列表,而一小段以“ e”开头的函数列表,那么查找以“ e”开头的函数的函数名称一定会花费一定的时间。” –表示从d开始查找函数时会发生时间损失?通常,列表越大,在其中找到项目的时间越长
Pere

9
如您所写,您还没有研究过PHP解析器。感谢您提供这个无用的答案,因为它基于您对实现PHP的梦想。
支石墓

44

PHP手册上的模具

die —等同于退出

您甚至可以die;使用与exit;- 相同或不相同的方式进行操作。

选择的唯一的优点die()exit(),可能是你上键入一个额外的信抽出时间;-)


1
如果有人以其他方式熟悉其他语言,这也会为您带来便利
Rohan Khude

需要注意的是,如果以交互方式运行PHP( )php -a,,die; 并没有任何效果,而(没有分号)退出交互模式。die();exit;exit();exit
圣地亚哥·亚利桑那

31

正如所有其他的正确答案说,dieexit相同/别名。

尽管我有一个个人约定,当我希望在期望和期望的时候结束脚本的执行时,还是使用exit;。当由于某些问题(无法连接到db,无法写入文件等)而需要结束执行时,我通常die("Something went wrong.");会“杀死”脚本。

当我使用exit时:

header( "Location: http://www.example.com/" ); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit; // I would like to end now.

当我使用死时:

$data = file_get_contents( "file.txt" );
if( $data === false ) {
    die( "Failure." ); // I don't want to end, but I can't continue. Die, script! Die!
}
do_something_important( $data );

这样,当我exit在代码中的某个点看到代码时,我知道此时我想退出,因为逻辑在这里结束。当我看到时die,我知道我想继续执行,但是由于先前执行中的错误,我不能或不应该这样做。

当然,这仅在单独处理项目时有效。当有更多的人时,没有人会阻止他们使用dieexit在不符合我的约定的地方...


29

这是很有趣的事情。尽管exit()die()等效,但die() 关闭连接。exit() 不会关闭连接。

die()

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

exit()

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

结果:

exit()

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

die()

HTTP/1.1 304 Not Modified 
Connection: close

万一在您的项目中需要考虑到这一点。

积分:https : //stackoverflow.com/a/20932511/4357238


1
这应该是公认的答案。
ner0

2
只是测试它,并exitdie工作方式相同,他们都密切相关。
Grzegorz Adam Adam Kowalski

12

在功能方面,它们是相同的,但是我在以下情况下使用它们以使代码可读:

出现错误时使用die(),必须停止执行。

例如 die( 'Oops! Something went wrong' );

当没有错误并且必须停止执行时,请使用exit()。

例如 exit( 'Request has been processed successfully!' );


11

该页面说的dieexit,因此它们是相同的。还要说明一下:

有些函数是由于API清理或其他原因而更改了名称,而旧名称仅保留为别名,以实现向后兼容。使用这些别名通常是一个坏主意,因为它们可能会过时或重命名,这将导致脚本无法移植。

因此,称我为偏执狂,但die将来可能不会有病。


3
它还说,在某些情况下,多个名称中没有首选名称,例如is_int()is_integer()它们同样好。查看php-srcGitHub上的提交历史die(),至少自1999年将结构转换为SVN存储库以来,该结构就一直使用PHP,并且可能存在该语言的时间也很长。想象它将被弃用似乎是荒谬的。
Mark Amery 2014年

2
@MarkAmery,虽然他的前提不能得出结论,但结论本身是有效的:〜“叫我偏执狂,但exit将来可能没有。或者将来可能没有die。”
Pacerier 2015年

@Pacerier非常正确。将来可能没有PHP,因此让我们所有人都退出此编程工作,成为承办商或税收征收者。毕竟,除了死亡和税收外,没有什么是确定的。
Mark Amery 2015年

@MarkAmery,“将来没有PHP”似乎超出了平均水平的偏执狂。历史表明,疯狂流行的语言不会轻易消失(Fortran!)。
Pacerier

1
不要偏执。出口永远不会。:)
支石墓


6

它们本质上是相同的,尽管本文另有建议。


1
那篇文章很奇怪;从扫描仪定义中可以看出它们是等效的;如果存在任何差异,则可能是在没有操作缓存的情况下运行了测试。
杰克

本文是关于由于未发布代码而无法复制的基准。只是忽略它。
支石墓

0

在功能上,它们是相同的。因此,选择使用哪个完全是个人喜好。在英语语义上,它们是不同的。模具听起来很消极。当我有一个将JSON数据返回到客户端并终止程序的函数时,如果我调用此函数jsonDie()可能会很糟糕,而更合适的方法是将其称为jsonExit()。因此,我总是使用exit而不是die。


OP仅询问有关PHP退出和死亡的功能。
黑色曼巴舞

1
是的,我只是在回答这个问题。但是要知道,问题不仅仅在于功能上的差异。
罗炯辉

我最可爱的功能之一就是pd()-这意味着“请死”。因此,在这样的背景下,我不确定死亡是否是一件坏事:)
伊万·波诺马列夫

作为一个全栈开发人员,我不仅将自己视为一名程序员,而且还将自己视为用户体验设计师。在这种情况下,同情很重要。同情不仅会影响我设计UI的方式,还会影响我编码的方式。
罗炯辉

0

据我所知,当我在这里看这个问题时

它说:“在PHP中,Header输出有明显的区别。在下面的示例中,我选择使用不同的Header,但是为了显示出exit()和die()之间的区别并不重要”,并经过测试(个人)


-3

在w3schools中,测验:die()和exit()函数的作用完全相同吗?我的回答是错误的。那是不正确的答案。正确答案是正确的。

这是屏幕截图: 在此处输入图片说明


-5

我在脚本中至少注意到的一点是exit()将停止当前正在执行的脚本并将控制权传递回任何调用脚本,而die将停止php。我会说那有很大的不同?


1
@AdarshMadrecha这是不正确的。如果它们在子函数内部或外部,则php脚本始终停止。
MERTDOĞAN18年

-5

exit()函数和die()函数的结果始终相同。但是,正如别名手册页(http://php.net/manual/en/aliases.php)中所述,它说die()函数调用exit函数。我认为它像下面这样硬编码:

function die($msg){
  exit($msg);
}

对于小型,中型和大型项目而言,这不是性能问题,但是如果项目具有数十亿乘以十亿乘以十亿的过​​程,则这会发生非常重要的性能优化状态。

但是,大多数人并不认为这是一个问题,因为如果您拥有这么多的进程,那么您必须比函数是master或alias想到更多的问题。

但是,确切的答案是:始终主控功能比别名更快。

最后; 别名手册页上说,您可能不再使用die。它只是一个别名,不建议使用。

使用这些别名通常是一个坏主意,因为它们可能会过时或重命名,这将导致脚本无法移植。提供此列表是为了帮助那些希望将其旧脚本升级为较新语法的用户。


2
别名不是“调用函数”。在拟定假设之前,请检查您的假设。
支石墓

@dolmen别名始终以硬代码调用主要功能。这是一个通用的编程规则。
MERTDOĞAN18年

@MERTDOĞAN别名不会调用任何东西。别名(在编程或现实生活中)只是对象的另一个名称(已经有名称)。die()不是单独的功能。它只是的另一个名称exit()。该答案包含有关别名及其性能的不正确陈述。
axiac

docs.php.net/manual/en/… 别名始终像上面的示例一样被调用。学点东西然后回来。
MERTDOĞAN18年

-10

它们听起来大致相同,但是exit()也允许您设置PHP脚本的退出代码。

通常,您实际上并不需要此脚本,但是在编写控制台PHP脚本时,您可能需要与Bash一起检查脚本是否以正确的方式完成了所有操作。

然后,您可以使用exit()并稍后进行捕获。Die()不支持。

Die()始终以代码0存在。因此从本质上来说die()命令执行以下操作:

<?php
echo "I am going to die";
exit(0);
?>

与以下内容相同:

<?php
die("I am going to die");
?>

42
这不是真的。 dieexit相同(它们产生相同的解析器标记(T_EXIT),并由相同的代码执行)。如果参数是整数,它将把该代码返回给shell。如果不是,它将输出并返回0。所以dieexit字面上是彼此的别名。
ircmaxell,2011年

6
好吧,如果您知道可以使用exit(“ I'm exiting ...”);
Yuda Prawira

4
到目前为止,有23票赞成错误答案!这就是为什么在阅读完所有有关该问题的竞争性答案并理解所有答案之前(除非我写不出任何令人费解的可怕答案),然后才对答案进行投票的原因。
Mark Amery 2014年

3
这正是@GeoffreyHale在其答案中所写的内容。您发布的答案是人们所期望的,来自诸如Perl或C之类的语言。但是正如其他人提到的那样,对于php而言并非如此。您可能会真正考虑编辑您的答案以反映此问题,否则将其删除。
莱维特2015年
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.