exit,exit(),exit(0),die(),die(0)-如何退出脚本


80

我相信所有这些(甚至die()die(0))都是相同的。如果它们不相同,那么成功退出脚本的首选方法是什么?如果它们相同,是否有任何首选标准来指示脚本成功完成?我倾向于使用exit;

编辑:所有的答案都有“die()并且exit()是相同的”,即使我在我的问题中这么说。我更新了标题,希望更清楚地说明这不是我的问题。我想从命令行脚本中清楚地表明成功。



不要使用任何这些...只需结合使用echo和return。

2
@HiroProtagonist完全不同意;return有不同的含义
爆炸药2012年

Answers:


65

这些都是相同的。我敢肯定,die()这只是的简单别名exit(),但是即使不是,它的行为也一样。

当为这些函数之一提供字符串参数时,它将在终止进程之前打印出字符串。当它遇到小于255的整数时,该整数将被视为该进程的返回码,该返回码将传递回调用PHP脚本的进程。这在编写命令行应用程序时特别有用(PHP不仅限于Web!)。

至于之间的差异exitexit()exit(0),真的是没有的。前两者之间绝对没有区别,因为exit从技术上讲它是一种语言构造,而不是一个函数,因此可以像使用一样在带或不带括号的情况下调用它echo。返回代码0意味着“该程序运行成功/没有错误”,尽管我不知道当您不传递参数时会发生什么,PHP.net却说少参数exit表示成功,所以我敢打赌它返回0,尽管再次PHP.net不显示该参数的默认值。


3
exit(0)表示成功退出,exit(1)表示失败退出。
Yousha Aleayoub

仅供参考,从未在任何地方(包括PHP手册)明确提及,使用字符串参数调用exit(或die)时实际的退出代码是什么。看过例如常见的die(-1)成语,并且也die("Poo!...")经常听到很多,一个人可能还是不太确定,反正:猜测应该属于其他职业...所以,FTR:它是0。这也意味着后者die("error!")将最实际上可能是CLI脚本中的错误!:-o
Sz。

6

正如几个人提到的那样,die()和exit()完全相同。

如果您查看PHP文档,则有两个参数选项:

  • 一个数字值。仅当您从命令行而不是Web服务器使用PHP时,此功能才有用。零值表示成功。非零表示发生故障情况。

  • 字符串值。退出时,这将显示在浏览器中。

我建议使用异常和自定义顶级异常处理程序来管理故障情况,而不是die()或exit()。

通过这种方式执行自动错误日志记录等操作,您将具有更大的灵活性。另外,如果您使用PHP来实现JSON API,则此异常处理程序可以移交有效的,错误指示的JSON代码段。


我了解失败情况,但是我想正确地指出成功。
爆炸药

通常,基于浏览器的交互只是die()。对于php的命令行用法,请执行die(0)。
nsanders

值得一提的是... die()本身并不表示错误情况。它只是停止所有php脚本的执行。
nsanders

+1提及命令行,太多人忘记了命令行php
约翰·木兰

@JohnMagnolia:但是,当他说“退出时将显示在浏览器中”时,他立即忘记了下面的同一件事。;)(当然,它也显示在CLI控制台中。)
Sz。

5

我想说的是,对于一个更好的语义,die($arg);应该将其用于异常或意外终止,即使-当然-您仍然抓住了它。并且exit($arg);应用于过程的正常(预期/控制)末端,例如break;用于forwhileswitch结构,但具有确定的末端。

但是..我个人经常使用一般if { } else { }结构来控制大型进程的不同分支或输出缓冲,因此不必使用“退出”。

我还使用die($arg)了简单的错误捕捉语义,例如

$db = mysql_connect([$args]) or die ($error); ...


1

die();只是它的同义词,exit();并且在功能上是相同的。

标准方法是使用退出代码零表示成功,使用其他任何方式表示错误情况。


1

die()通常用于杀死带有错误输出的脚本:

die("There was a fatal error");

where-as出口通常用作成功出口(至少在我的编码中)

PHP手册说,功能是相同的。


1

我会下地狱,但在某些情况下,如果在CLI中黑客入侵,我们不希望该程序被杀死,而又不想继续执行全部代码。

此处的目标是避免对单独的指针文件进行api调用。假设我的界面上有一个不错的播放按钮,可以执行系统调用。

示例1:作业结束后程序被杀死,没有数据返回。这是不想要的。

if ($_GET["play"] != ""){
  // Some job
  exit; 
}
/* Huge amount of data*/ 

示例2:程序仍在运行,将整个数据提供给GET请求。在这种情况下,这是不必要的。这使浏览器的所有数据都变慢了,他已经有了。

if ($_GET["play"] != ""){
  // Some job
}
/* Huge amount of data*/ 

示例3:程序仍在运行,没有按预期返回任何数据,已经执行了play命令,但是对整个数据集进行了解析,这是不必要的工作,会降低php /机器的速度。

/* Huge amount of data*/ 
if ($_GET["play"] != ""){
  // Some job
}

示例4:程序仍在运行,没有按预期返回任何数据,已经执行了play命令,还没有解析整个数据,php迅速返回了200OK,响应为空,非常快。大家开心!

if ($_GET["play"] != ""){
  // Some job
  goto END;
}
/* Huge amount of data*/
END;

是! 有时最好考虑使用GOTO-🔨-!

https://www.php.net/manual/zh/control-structures.goto.php

https://i.stack.imgur.com/kQnqC.png


0

die完全等同于exit

从手册

如果status为整数,则该值将用作退出状态。

仅当您有某种包装程序根据退出状态执行某些操作时,此选项才有用。除非您有特殊需要向外界报告退出代码,否则只需exit;

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.