PHP中的函数die()
和函数有什么区别?exit()
我认为两者都具有相同的功能,但我怀疑两者之间是否存在不同......它是什么?
die()
PHP和exit()
PHP之间的区别在于它们的起源。
PHP 手册die
:
这种语言结构等价于
exit()
.
PHP 手册exit
:
注意:此语言结构等价于
die()
.
函数别名列表的PHP 手册:
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 有很多像这样奇怪的冗余——它试图对来自不同语言背景的人友好,但这样做的同时,它会产生令人困惑的冗余。
如前所述,这两个命令产生相同的解析器标记。
但
有一个小的区别,那就是解析器返回令牌需要多长时间。
我没有研究过PHP解析器,但是如果它是以“d”开头的一长串函数,以及一个以“e”开头的较短列表,那么查找以“开头的函数的函数名”肯定会有时间损失e”。由于检查整个函数名称的方式,可能存在其他差异。
我怀疑除非您有一个专门用于解析 PHP 的“完美”环境以及许多具有不同参数的请求,否则它将是可测量的。但是肯定是有区别的,毕竟PHP是一种解释型语言。
这是一件非常有趣的事情。虽然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
以防万一您的项目需要考虑到这一点。
正如所有其他正确答案所说,die
并且exit
是相同/别名。
虽然我有一个个人约定,当我想在预期和期望时结束脚本的执行时,我使用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.
当我使用模具时:
$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
,我知道我想继续执行,但由于之前执行中的错误,我不能或不应该。
当然,这只适用于单独处理项目时。当有更多的人时,没有人会阻止他们使用die
或者exit
它不符合我的约定......
在功能方面它们是相同的,但我在以下场景中使用它们以使代码可读:
当出现错误并且必须停止执行时使用 die()。
例如
die( 'Oops! Something went wrong' );
当没有错误并且必须停止执行时使用 exit()。
例如
exit( 'Request has been processed successfully!' );
https://3v4l.org的这个输出表明 die 和 exit 在功能上是相同的。
这个页面说die
是 的一个别名exit
,所以它们是相同的。但也解释说:
由于 API 清理或其他原因,有些函数更改了名称,并且旧名称仅作为别名保留以实现向后兼容性。使用这些别名通常不是一个好主意,因为它们可能会被废弃或重命名,这将导致脚本不可移植。
die
所以,叫我偏执狂吧,但未来可能没有。
它们本质上是相同的,尽管本文提出了不同的建议。
据我所知,当我在这里看到这个问题时
它在那里说“在 PHP 中,Header 输出存在明显差异。在下面的示例中,我选择使用不同的标题,但为了显示 exit() 和 die() 之间的区别并不重要”,并测试(个人)
在功能上,它们是相同的。所以选择使用哪一个完全是个人喜好。在英语语义上,它们是不同的。死听起来很消极。当我有一个向客户端返回 JSON 数据并终止程序的函数时,如果我调用这个函数 jsonDie() 可能会很糟糕,调用它 jsonExit() 更合适。出于这个原因,我总是使用 exit 而不是 die。
exit() 函数和 die() 函数的结果总是相同的。但正如别名手册页(http://php.net/manual/en/aliases.php)中所解释的,它说 die() 函数调用退出函数。我认为它是硬编码的,如下所示:
function die($msg){
exit($msg);
}
对于小型、中型和大型项目来说,这不是性能问题,但如果项目有数十亿乘以十亿乘以十亿的进程,这会发生非常重要的性能优化状态。
但是大多数人并不认为这是一个问题,因为如果你有这么多进程,那么你必须比一个函数是主函数或别名时考虑更多的问题。
但是,确切的答案是;allways master 函数比 alias 更快。
最后; Alias 手册页上说,您可能不再使用 die。它只是一个别名,已被弃用。
使用这些别名通常不是一个好主意,因为它们可能会被废弃或重命名,这将导致脚本不可移植。提供此列表是为了帮助那些想要将旧脚本升级到新语法的人。
我至少在我的脚本中注意到的一点是 exit() 将停止当前正在执行的脚本并将控制权传递回任何调用脚本,而 die 将停止 php 的运行。我会说这是一个很大的区别?
它们听起来差不多,但是,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");
?>