exit, exit (), exit (0), die (), die (0) - Cómo salir del script

81

Creo que todos estos (e incluso die()o die(0)) son idénticos. Si no son idénticos, ¿cuál se prefiere para salir de un script con éxito? Si son idénticos, ¿existe algún estándar preferido para indicar la finalización exitosa del guión? Tiendo a usar exit;.

EDITAR: Todas las respuestas tienen " die()y exit()son idénticas" a pesar de que digo eso en mi pregunta. Actualicé el título para que quede más claro que esta NO es mi pregunta. Quiero indicar claramente el éxito desde un script de línea de comandos.

Pastillas de explosión
fuente
4
Creo que son idénticos stackoverflow.com/questions/1795025/…
Doug Owings
no use ninguno de estos ... solo use una combinación de eco y retorno.
2
@HiroProtagonist totalmente en desacuerdo; returntiene una implicación diferente
Píldoras

Respuestas:

67

Todos son idénticos. Estoy bastante seguro de que die()es solo un alias directo de exit(), pero incluso si no lo es, sigue actuando de manera idéntica.

Cuando una de estas funciones recibe un argumento de cadena, imprime la cadena antes de terminar el proceso. Cuando encuentra un número entero por debajo de 255, ese número entero se considera el código de retorno del proceso, que se devuelve al proceso que invocó el script PHP. Esto es particularmente útil al escribir aplicaciones de línea de comandos (¡PHP no es solo web!).

En cuanto a la diferencia entre exit, exit()y exit(0), realmente hay ninguno. Definitivamente no hay diferencia entre los dos primeros porque exittécnicamente es una construcción del lenguaje, no una función, por lo que se puede llamar con o sin paréntesis, al igual que echo. Devolver un código de 0significa "este programa se ejecutó correctamente / sin errores", y aunque no sé qué sucede exactamente cuando no pasas un argumento, PHP.net dice que un argumento sin argumentos exitindica éxito, así que apostaría regresa 0, aunque nuevamente PHP.net no muestra un valor predeterminado para el argumento.

AgenteConundrum
fuente
3
exit(0)significa salir con éxito, exit(1)significa salir con error.
Yousha Aleayoub
Para su información, nunca se menciona explícitamente en ninguna parte (incluido el manual de PHP), cuál sería el código de salida real al llamar exit(o die) con un parámetro de cadena. Habiendo visto, por ejemplo, el die(-1)modismo común , y también die("Poo!...")llamadas muchas, puede que uno no esté tan seguro después de todo, y de todos modos: adivinar debería pertenecer a otras profesiones ... Entonces, FTR: es 0. Lo que también significa que este último, die("error!")sería más probablemente sea un error en los scripts de CLI, en realidad. : -o
Sz.
6

Como han mencionado varias personas, die () y exit () son exactamente lo mismo.

Si observa la documentación de PHP , hay dos opciones para los argumentos:

  • Un valor numérico. Esto solo es útil si está utilizando PHP desde la línea de comandos, en lugar de un servidor web. Un valor de cero indica éxito. Distinto de cero indica que ocurrió una condición de falla.

  • Un valor de cadena. Esto se mostrará en el navegador cuando se produzca la salida.

En lugar de morir () o salir (), recomiendo usar excepciones y un controlador de excepciones de nivel superior personalizado para administrar las condiciones de falla.

De esa manera, tiene más flexibilidad para hacer cosas como el registro automático de errores. Además, si está utilizando PHP para implementar una API JSON, este controlador de excepciones puede devolver un fragmento JSON válido que indique errores.

nsanders
fuente
Entiendo las condiciones de falla, pero quiero indicar el éxito correctamente.
Píldoras
Para la interacción normal basada en el navegador simplemente muere (). Para el uso de línea de comandos de php, muere (0).
nsanders
Vale la pena mencionar que ... die () por sí solo no indica una condición de error. Simplemente detiene toda la ejecución del script php.
nsanders
+1 mencionando la línea de comando, demasiadas personas se olvidan de la línea de comando php
John Magnolia
@JohnMagnolia: Pero luego se olvidó de lo mismo inmediatamente debajo, cuando dijo "se mostrará en el navegador cuando se produzca la salida". ;) (Por supuesto, también se muestra en una consola CLI.)
Sz.
5

Yo diría que en lo que respecta a una mejor semántica se die($arg);debe usar para una terminación anormal o inesperada, incluso cuando -por supuesto- todavía la hayas pillado. Y exit($arg);debe usarse para un final normal (esperado / controlado) de un proceso, como break;para una foro whileo una switchestructura pero con un final definitivo.

Sin embargo ... personalmente, a menudo uso una if { } else { }estructura general para controlar diferentes ramas de procesos enormes o el almacenamiento en búfer de salida para no tener que usar "salir" ...

También lo uso die($arg)en semánticas simples de detección de errores como en

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

jjyepez
fuente
1

die();es solo un sinónimo exit();y es funcionalmente idéntico.

La forma estándar es utilizar el código de salida cero para indicar el éxito y cualquier otra cosa para indicar una condición de error.

slugonamission
fuente
1

die () se usa normalmente para matar el script con una salida de error:

die("There was a fatal error");

where-as exit se usa normalmente como una salida exitosa (al menos en mi codificación)

El Manual de PHP dice que las funciones son idénticas.

xthexder
fuente
1

Voy a ser votado al infierno , pero en algunos casos al piratear en CLI, no queremos que el programa sea eliminado, mientras que no queremos continuar con la ejecución completa.

Aquí el objetivo es evitar hacer llamadas a la API a un archivo de punto de mano separado. Digamos que tengo un buen botón de reproducción en mi interfaz, que ejecuta llamadas al sistema.

Ejemplo 1: El programa se mata después del trabajo, no se devuelven datos. Esto no se quiere.

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

Ejemplo 2: el programa aún se ejecuta , alimentando todos los datos en la solicitud GET. Esto es innecesario en este caso. Esto está ralentizando el navegador con todos los datos que ya tiene.

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

Ejemplo 3: El programa aún se ejecuta , no se devolvieron datos como se esperaba, el comando play se ejecutó, pero se analizó todo el conjunto de datos, este es un trabajo innecesario, puede ralentizar php / la máquina.

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

Ejemplo 4: El programa aún se ejecuta , no se devolvieron datos como se esperaba, se ejecutó el comando de reproducción, no se analizaron todos los datos, php devolvió superrápidamente 200OK con una respuesta vacía, como se esperaba. ¡Todo el mundo feliz!

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

¡Si! ¡Usar GOTO, a veces se debe considerar -como lo mejor que se puede hacer 🔨 -!

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

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

NVRM
fuente
0

die es exactamente equivalente a exit .

Del manual :

Si el estado es un número entero, ese valor se utilizará como estado de salida.

Esto solo es útil si tiene algún tipo de contenedor que hace algo en función del estado de salida. A menos que tenga una necesidad específica de informar un código de salida al mundo exterior, simplemente exit;.

Hamish
fuente