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

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

我认为两者都有相同的功能,但我怀疑两者之间有什么不同……它是什么?

302494 次浏览

没有区别,它们是一样的。

exit的PHP手册:

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

die的PHP手册:

此语言结构等效于exit()

它们本质上是相同的,尽管这个文章建议不同。

它们听起来是一样的,但是,出口()也允许您设置PHP脚本的退出代码。

通常你并不真的需要这个,但是在编写控制台PHP脚本时,你可能想要检查例如Bash脚本是否以正确的方式完成了所有的事情。

然后您可以使用出口()并稍后捕获它。 但是,Die()不支持这一点。

Die()总是以代码0存在。 所以本质上die()命令执行以下操作:

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

这是相同的:

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

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

但是

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

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

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

死亡上的PHP手册:

die-相当于退出

你甚至可以像exit;一样做die;-有或没有父母。

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

本页面dieexit的盟友,所以它们是相同的。但也解释了这一点:

有些函数由于API清理或其他原因更改了名称,并且旧名称仅保留为向后兼容的别名。使用此类别名通常是个坏主意,因为它们可能会绑定到过时或重命名,这将导致脚本不可移植。

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

起源的差异

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


功能相等

die()exit()等效功能。

PHP手册

die的PHP手册:

此语言结构等效于exit()

exit的PHP手册:

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

函数别名列表的PHP手册:

die是master函数exit()的别名


不同于其他语言

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

来自另一个PHP咆哮

…作为一个C和Perl编码器,我准备回答,“为什么,出口()只是bails 以数字退出状态关闭程序,而die()打印出 错误消息到stderr并以EXIT_FAILURE状态退出。” 我记得我们在PHP的混乱语法领域。

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

设计者显然认为“嗯,让我们借用退出()C。和Perl 如果我们也采取die()来自Perl,人们可能会喜欢它。 哎呀!我们现在有两个退出函数!让我们使它们都 可以将字符串或整数作为参数并使它们相同!”

最终的结果是,这并没有真正使事情变得“更容易”, 只是更令人困惑。C和Perl程序员将继续使用出口()来 只抛出一个整数退出值,然后die()抛出错误消息 并以失败退出。新手和PHP作为第一语言的人 可能会想“嗯,两个退出函数,我应该使用哪个 使用?“手册没有解释为什么有出口()和死亡()。

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

正如所有其他正确答案所说,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,因为它不符合我的惯例…

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

https://3v4l.org的此输出表明die和出口在功能上是相同的。 输入图片描述

我至少在我的脚本中注意到的一点是出口()将停止当前正在执行的脚本并将控制权传递回任何调用脚本,而die将停止其轨道中的php。我想说这有很大的区别吗?

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

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

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

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

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

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

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

这里有一些非常有趣的东西。虽然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://stackoverflow.com/a/20932511/4357238

从我看到这个问题时所知道的这里

它在那里说“在PHP中,Header输出有明显的差异。在下面的示例中,我选择使用不同的标头,但为了显示退出()和die()之间的区别,这并不重要”,并(亲自)测试

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

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

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

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

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

die()的键入速度比out()快;