PHP中的die()和exit()有啥区别?

Posted

技术标签:

【中文标题】PHP中的die()和exit()有啥区别?【英文标题】:What are the differences in die() and exit() in PHP?PHP中的die()和exit()有什么区别? 【发布时间】:2010-12-20 04:23:55 【问题描述】:

php 中的die()exit() 函数有什么区别?

我认为两者具有相同的功能,但我怀疑两者之间是否存在不同...这是什么?

【问题讨论】:

exit() 只是以数字退出状态退出程序,而 die() 将错误消息打印到 stderr 并以 EXIT_FAILURE 状态退出。 so exit() is exit and die() is also exit :) 【参考方案1】:

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

exit 的 PHP 手册:

注意:这种语言结构等同于die()

die 的 PHP 手册:

这种语言结构等同于exit()

【讨论】:

别名允许程序员使用自己熟悉的那个。我记得退出总比死好。其他一些人记得死比退出更好。 this (php.net/manual/en/aliases.php) 可能会解释为什么 2 个函数做同样的事情 即使他们做同样的事情,我通常为错误相关的停止保留die,为所有其他情况保留exit。阅读代码时似乎更流畅。 抱歉恢复这个,但至少对我来说...dieexit 写起来要快得多...我开始使用exit,因为它更易读非 PHP 程序员,但die 在您赶时间时打字速度更快。另外,顺便说一句,我不用改变手的位置来写die @mauris,我是way better for one function to have just one name。想象一下每个 PHP 函数都有两个名称,那将是一团糟【参考方案2】:

原产地不同

die()exit() 在 PHP 中的区别在于它们的起源

exit() 来自exit() in Cdie() 来自die in Perl

功能等效

die()exit()等效函数。

PHP 手册

die 的 PHP 手册:

这种语言结构等同于exit()

exit 的 PHP 手册:

注意:这种语言结构等同于die()

List of Function Aliases 的 PHP 手册:

die是主函数exit()的别名


其他语言不同

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

来自Yet another PHP rant:

...作为 C 和 Perl 编码器,我已经准备好回答:“为什么,exit() 只是保释 以数字退出状态关闭程序,而 die() 打印出 错误消息到 stderr 并以 EXIT_FAILURE 状态退出。”但是然后 我记得我们在 PHP 的混乱语法领域。

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

设计师显然认为“嗯,让我们借用exit() from C。还有Perl 如果我们也接受die() as is from Perl,人们可能会喜欢它。 哎呀!我们现在有两个退出函数!让我们让他们俩 可以将字符串或整数作为参数并使它们相同!”

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

一般来说,PHP 有很多像这样奇怪的冗余——它试图 对来自不同语言背景的人友好, 但在这样做的同时,它会产生令人困惑的冗余。

【讨论】:

尽管这是第 100 个说明它们是等价的答案(正如我的回答中所见 ^^),但这确实增加了一些非常好的点。最重要的是它们在其他语言中不一样(因此首先是混淆)。 (+1) @Levit,不,不,你得到它完全错误。没有人拥有名称,不同的语言以不同的方式重用相同的名称。这很好,因为我们不需要yet another 标准的做事方式。 “一开始的混乱”是由于 PHP 将 two different names 分配给一个函数.. @Pacerier:当然,如果你从“谁的错”的角度来看,那是绝对正确的。尽管如此,它们在几种语言中只是意味着不同的东西(这没关系),这也是一个事实。从中立的角度来看,它肯定是正确的:由于含义不同而造成混淆(即使创建两个相等的函数别名是 php 的错)。如果您从我的评论中理解的话,我绝对不想指责任何一种语言……(伟大的 xkcd btw (Y) ^^) 这绝对应该是选择的答案,很好的描述! 另一位用户回答说exit() 不会关闭连接,而die() 会关闭连接,这似乎是相关的。【参考方案3】:

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

但是

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

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

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

【讨论】:

@Timeless,完美主义者不会说“PHP 是一种解释型语言”。 PHP 是一种可以根据您的服务器设置进行解释或编译的语言。 而且...“die”是 3 个字符,而“exit”是 4 个字符。因此,它占用的内存和文件空间减少了 25%! ;) '"如果它是一个以“d”开头的长函数列表,和一个以“e”开头的较短列表,那么查找以“ e"'。您不是说查找以 d 开头的函数时会发生时间损失吗?通常,列表越大,在其中找到项目的时间就越长。 正如您所写的,您还没有研究过 PHP 解析器。感谢您提供这个无用的答案,因为它基于您对 PHP 实现方式的梦想。【参考方案4】:

die 上的 PHP 手册:

die — 相当于退出

您甚至可以像 exit; 一样使用 die; - 带或不带括号。

选择die() 而不是exit() 的唯一优势可能是您可以节省时间输入额外的字母;-)

【讨论】:

当有人来自其他语言时,如果他们对任何一种方式都熟悉的话,这也很方便 请注意,如果交互式运行 php (php -a) die;die();exit;exit(); 无效,而 exit(不带分号)退出交互模式。 【参考方案5】:

这里有一些非常有趣的东西。尽管exit()die() 是等价的,但die() 关闭 连接。 exit() 不关闭连接。

die():

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

exit():

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

结果:

die():

HTTP/1.1 304 Not Modified 
Connection: close

exit():

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

以防万一您的项目需要考虑到这一点。

致谢:https://***.com/a/20932511/4357238

【讨论】:

刚刚测试过,exitdie 工作方式相同,它们都关闭了连接。【参考方案6】:

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

虽然我有一个个人约定,当我想在预期和期望时结束脚本的执行时,我使用exit;。当我因为一些问题需要结束执行时(无法连接到数据库,无法写入文件等),我使用die("Something went wrong."); 来“杀死”脚本。

当我使用退出时:

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.

当我使用 die 时:

$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...

【讨论】:

我喜欢这个答案。对于那些哀叹两个名字如何引起混淆的人,请利用它来发挥自己的优势。【参考方案7】:

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

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

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

在没有错误且必须停止执行时使用 exit()。

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

【讨论】:

【参考方案8】:

https://3v4l.org 的输出表明 die 和 exit 在功能上是相同的。

【讨论】:

【参考方案9】:

This page 说dieexit 的别名,所以它们是相同的。但也说明:

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

所以,叫我偏执狂吧,但将来可能没有dieing。

【讨论】:

它还说 在某些情况下,多个名称中没有首选名称,例如 is_int()is_integer() 同样好。 查看php-src在 GitHub 上的提交历史中,die() 结构至少从 1999 年被转换为 SVN 存储库以来就一直在 PHP 中,并且可能只要该语言存在。想象它会被弃用似乎很荒谬。 @MarkAmery,虽然他的前提不能导致他的结论,但结论本身是有效的:〜“叫我偏执狂,但将来可能没有exit。或者未来可能没有die @Pacerier 完全正确。未来可能没有 PHP,所以让我们都退出这个编程工作,成为承办商或税务员。毕竟,除了死亡和税收之外,没有什么是确定的。 @MarkAmery,“将来没有 PHP” 似乎过于偏执了。历史表明,疯狂流行的语言不会那么容易消亡(Fortran!)。 不要偏执。 exit 永远不会。 :)【参考方案10】:

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

【讨论】:

那篇文章很奇怪;从scanner definition 你可以看出它们是等价的;如果有任何区别,也许测试是在没有 opcache 的情况下运行的。 这篇文章是关于一个无法复制的基准测试,因为代码没有发布。忽略它。【参考方案11】:

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

【讨论】:

OP 只询问 PHP 退出和死函数。 是的,我只是在回答这个问题。但请注意,问题不仅仅在于功能上的差异。 我最可爱的函数之一叫做 pd() - 这意味着请死。所以我不确定在这种情况下死亡是一件坏事:) 作为一名全栈开发人员,我不仅将自己视为一名程序员,而且将自己视为一名用户体验设计师。在这种情况下,同情很重要。同情不仅会影响我设计 UI 的方式,还会影响我的编码方式。【参考方案12】:

根据我看到这个问题时所知道的here

那里说“在 PHP 中,Header 输出存在明显差异。在下面的示例中,我选择使用不同的 header,但为了显示 exit() 和 die() 之间的区别,问题”,并(亲自)测试

【讨论】:

【参考方案13】:

exit() 函数和 die() 函数的结果总是相同的。但正如别名手册页 (http://php.net/manual/en/aliases.php) 中所解释的那样,它说 die() 函数调用了退出函数。我认为它是硬编码的,如下所示:

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

这对于小型、中型和大型项目来说都不是性能问题,但如果项目有数十亿乘以十亿乘以十亿的进程,这会发生非常重要的性能优化状态。

但大多数人并不认为这是个问题,因为如果你有那么多进程,你肯定比一个函数是主函数或别名的问题更多。

但是,确切的答案是; allways master 函数比 alias 更快。

最后; Alias manual page 说,你可能不再使用 die。它只是一个别名,已被弃用。

使用这些别名通常是个坏主意,因为它们可能是 必然会过时或重命名,这将导致不可移植 脚本。提供此列表是为了帮助那些想要升级他们的 旧脚本到新语法。

【讨论】:

别名不是“调用函数”。在阐述假设之前检查您的假设。 @dolmen Aliases 总是以硬代码调用主要函数。这是一般的编程规则。 @MERTDOĞAN 别名不会调用任何东西。别名(在编程或现实生活中)只是对象的另一个名称(已经有名称)。 die() 不是一个单独的函数。它只是exit() 的另一个名称。此答案包含有关别名及其性能的错误陈述。 docs.php.net/manual/en/… 别名总是像上面的例子一样调用。学习一些东西然后回来。【参考方案14】:

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

【讨论】:

@AdarshMadrecha 这不是真的。如果它们在子函数内部或外部,php 脚本总是停止。【参考方案15】:

它们听起来差不多,但是,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");
?>

【讨论】:

这不是真的。 dieexit 是相同的(它们产生相同的解析器令牌 (T_EXIT) 并由相同的代码执行)。如果参数是一个整数,它会将该代码返回给 shell。如果不是,它将输出它并返回 0。所以dieexit 是彼此的别名。 如果你知道你可以使用 exit("I'm exiting..."); 到目前为止,有 23 人支持一个完全错误的答案!这就是为什么在我阅读了该问题的所有相互竞争的答案并全部理解之前,我从不对答案投票的原因(除非写得非常糟糕,我无法理解)。 这正是@GeoffreyHale 在他的回答中所写的。您发布的答案是人们所期望的,来自 Perl 或 C 之类的语言。但是正如其他人提到的那样,对于 php,它不是正确的。您可能真的考虑编辑您的答案以反映这一点,或者以其他方式删除它。

以上是关于PHP中的die()和exit()有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

说一下PHP中die()和exit()区别

PHP中exit()与die()的区别

PHP中 die() 和 exit() 的区别

php 中die() 和 exit() 的区别

说一下PHP中die()和exit()区别

PHP中exit()与die()的区别