¿Cuáles son las diferencias en die () y exit () en PHP?

678

¿Cuáles son las diferencias entre die()y exit()funciones en PHP?

Creo que ambos tienen la misma funcionalidad, pero dudo que haya algo diferente en ambos ... ¿qué es?

coderex
fuente
2
exit () simplemente rescata el programa con un estado de salida numérico, mientras que die () imprime el mensaje de error en stderr y sale con el estado EXIT_FAILURE. so exit() is exit and die() is also exit :)
Muhammad Shahzad

Respuestas:

541

No hay diferencia, son lo mismo.

Manual PHP para exit:

Nota: Esta construcción de lenguaje es equivalente a die().

Manual PHP para die:

Esta construcción del lenguaje es equivalente a exit().

Marek Karbarz
fuente
17
Los alias permiten a los programadores utilizar el que les resulte más cómodo. Recuerdo salir mejor que morir. Algunos otros recuerdan morir mejor que salir.
mauris el
28
esto ( php.net/manual/en/aliases.php ) podría dar alguna explicación de por qué 2 funciones hacen lo mismo
Marek Karbarz
87
Aunque hacen lo mismo, generalmente reservo diepara paradas relacionadas con errores y exitpara todos los demás escenarios. Simplemente parece fluir mejor al leer el código.
nextgentech
77
Lamento revivir esto, pero al menos para mí ... diees mucho más rápido de escribir que exit... Estoy comenzando a usarlo exitporque es más legible para los programadores que no son PHP, pero diees más rápido de escribir cuando estás en prisa. Además, por mi forma de escribir, no tengo que cambiar la posición de mis manos para escribir die.
Alejandro Iván
77
@mauris, es mucho mejor para una función tener un solo nombre . Imagine que cada función PHP tiene dos nombres, eso sería un completo desastre .
Pacerier
222

DIFERENCIA EN ORIGEN

La diferencia entre die()y exit()en PHP es su origen .


FUNCIONALMENTE EQUIVALENTE

die()y exit()son funciones equivalentes.

Manual PHP

Manual PHP para die:

Esta construcción del lenguaje es equivalente a exit().

Manual PHP para exit:

Nota: Esta construcción de lenguaje es equivalente a die().

Manual PHP para la lista de alias de funciones :

die es un alias para la función maestra exit()


DIFERENTE EN OTROS IDIOMAS

die()y exit()son diferentes en otros lenguajes pero en PHP son idénticos.

Desde otro despotricar de PHP :

... Como codificador de C y Perl, estaba listo para responder: "¿Por qué, exit () simplemente abandona el programa con un estado de salida numérico, mientras que die () imprime el mensaje de error en stderr y sale con el estado EXIT_FAILURE. " Pero luego recordé que estamos en la tierra de sintaxis desordenada de PHP.

En PHP, exit () y die () son idénticos.

Los diseñadores obviamente pensaron "Hmm, tomemos prestada la salida () de C. Y a la gente de Perl probablemente les gustará si tomamos die () como es de Perl también. ¡Vaya! ¡Tenemos dos funciones de salida ahora! Hagamos que ambos puede tomar una cadena o un entero como argumento y hacerlos idénticos ".

El resultado final es que esto realmente no hizo las cosas "más fáciles", sino más confusas. Los codificadores C y Perl continuarán usando exit () para arrojar un valor de salida entero solamente, y die () para arrojar un mensaje de error y salir con una falla. Los novatos y la gente de PHP como primer idioma probablemente se preguntarán "umm, dos funciones de salida, ¿cuál debo usar?" El manual no explica por qué hay exit () y die ().

En general, PHP tiene mucha redundancia extraña como esta: trata de ser amigable con las personas que provienen de diferentes entornos de lenguaje, pero al hacerlo, crea redundancia confusa.

Geoffrey Hale
fuente
14
Aunque se trata de la respuesta número 100 que dice que son equivalentes (como también se ve en mi respuesta ^^), esto realmente agrega algunos puntos MUY buenos. Sobre todo, que NO son iguales en otros idiomas (de ahí la confusión en primer lugar). (+1)
Levite
@Levit, No, no, lo estás entendiendo totalmente mal . Nadie posee nombres y diferentes idiomas reutilizan los mismos nombres de manera no igual. Eso está bien porque no necesitamos otra forma estándar de hacer las cosas. La "confusión en primer lugar" se debe a que PHP asigna dos nombres diferentes a una función ..
Pacerier
2
@Pacerier: Claro, si lo miras desde el punto de "quién tiene la culpa", eso es absolutamente correcto. Aún así, también es un hecho que simplemente significan cosas diferentes en varios idiomas (lo cual está bien). Mirándolo desde una perspectiva neutral, definitivamente es cierto: hay confusión debido a los diferentes significados (incluso si es culpa de php por crear dos alias de función iguales). Definitivamente no quería señalar con el dedo a ninguno de esos idiomas, si eso fue lo que entendiste de mi comentario ... (genial xkcd por cierto (Y) ^^)
Levite
2
Esta definitivamente debería ser la respuesta elegida, ¡buena descripción!
Cody Brown el
Otro usuario respondió que exit()no cierra la conexión mientras lo die()hace, parece relevante.
ner0
62

Como se indicó anteriormente, estos dos comandos producen el mismo token analizador.

PERO

Hay una pequeña diferencia, y ese es el tiempo que tarda el analizador en devolver el token.

No he estudiado el analizador PHP, pero si es una larga lista de funciones que comienzan con "d" y una lista más corta que comienza con "e", entonces debe haber una penalización de tiempo al buscar el nombre de la función para las funciones que comienzan con " mi". Y puede haber otras diferencias debido a cómo se verifica el nombre completo de la función.

Dudo que sea medible a menos que tenga un entorno "perfecto" dedicado a analizar PHP y muchas solicitudes con diferentes parámetros. Pero debe haber una diferencia, después de todo, PHP es un lenguaje interpretado.

Beto
fuente
44
@Timeless, los perfeccionistas no dirían "PHP es un lenguaje interpretado". PHP es un lenguaje que puede interpretarse o compilarse dependiendo de la configuración de su servidor.
Pacerier
29
Y ... "morir" tiene 3 caracteres de largo frente a 4 para "salir". ¡Por lo tanto, requiere un 25% menos de memoria y espacio de archivo! ;)
Jan Derk
2
'"si es una larga lista de funciones que comienzan con" d ", y una lista más corta que comienza con" e ", entonces debe haber una penalización de tiempo al buscar el nombre de la función para las funciones que comienzan con" e "'. significa que la penalización de tiempo sucedería al buscar la función que comienza con d ? Por lo general, cuanto más grande sea la lista, más tiempo tendrá para encontrar un elemento en ella.
Pere
99
Como escribió, no ha estudiado el analizador PHP. Gracias por esta respuesta inútil ya que se basa en tus sueños sobre cómo se implementa PHP.
dolmen
44

Manual PHP en troquel :

morir - Equivalente a salir

Incluso puede hacer die;lo mismo que exit;con o sin parens.

La única ventaja de elegir die()más exit(), podría ser el momento de repuesto en la que escribir una carta adicional ;-)

Levita
fuente
1
también es conveniente cuando alguien viene de otro idioma, si se familiarizan de alguna manera
Rohan Khude el
Tenga en cuenta que si se ejecuta de forma interactiva php ( php -a) die;, die();, exit;y exit();no tienen ningún efecto, mientras que exit(sin coma) sale del modo interactivo.
santiago arizti
31

Como todas las otras respuestas correctas dicen, diey exitson idénticas / alias.

Aunque tengo una convención personal que cuando quiero finalizar la ejecución de un script cuando se espera y se desea, lo uso exit;. Y cuando necesito finalizar la ejecución debido a algunos problemas (no pude conectarme a db, no puedo escribir en el archivo, etc.), lo uso die("Something went wrong.");para "matar" el script.

Cuando uso exit:

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.

Cuando uso morir:

$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 );

De esta manera, cuando veo exiten algún punto de mi código, sé que en este punto quiero salir porque la lógica termina aquí. Cuando veo die, sé que me gustaría continuar con la ejecución, pero no puedo o no debo debido a un error en la ejecución anterior.

Por supuesto, esto solo funciona cuando se trabaja solo en un proyecto. Cuando haya más personas, nadie les impedirá usar dieo exitcuando no se ajuste a mis convenciones ...

Lukas
fuente
30

Aquí hay algo que es bastante interesante. Aunque exit()y die()son equivalentes, die() cierra la conexión. exit() no cierra la conexión

die():

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

exit():

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

Resultados:

exit():

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

die():

HTTP/1.1 304 Not Modified 
Connection: close

Solo por si necesita tener esto en cuenta para su proyecto.

Créditos: https://stackoverflow.com/a/20932511/4357238

Eduardo
fuente
1
Esta debería ser la respuesta aceptada.
ner0
2
Solo lo probé exity diefuncionan de la misma manera, ambos cierran la conexión.
Grzegorz Adam Kowalski
12

Funcionalmente, son idénticos, pero los uso en los siguientes escenarios para que el código sea legible:

Use die () cuando haya un error y deba detener la ejecución.

p.ej die( 'Oops! Something went wrong' );

Use exit () cuando no haya un error y deba detener la ejecución.

p.ej exit( 'Request has been processed successfully!' );

aagjalpankaj
fuente
11

Esta página dice que diees un alias de exit, por lo que son idénticos. Pero también explica que:

hay funciones que cambiaron los nombres debido a una limpieza de la API o alguna otra razón y los nombres antiguos solo se mantienen como alias para la compatibilidad con versiones anteriores. Por lo general, es una mala idea usar este tipo de alias, ya que pueden estar vinculados a la obsolescencia o el cambio de nombre, lo que conducirá a una secuencia de comandos no compatible.

Entonces, llámame paranoico, pero puede que no haya nada dieen el futuro.

Pedram Behroozi
fuente
3
También dice que en algunos casos no hay un nombre preferido entre los múltiples, is_int()y is_integer()son igualmente buenos, por ejemplo. Mirando el php-srchistorial de confirmación en GitHub, la die()construcción ha estado en PHP al menos desde 1999 cuando se convirtió en un repositorio SVN, y probablemente durante el tiempo que ha existido el lenguaje. Parece absurdo imaginar que alguna vez será desaprobado.
Mark Amery
2
@ MarkAmery, aunque sus premisas no conducen a su conclusión, la conclusión en sí es válida: ~ "Llámame paranoico, pero puede que no haya exiten el futuro. O puede que no haya dieen el futuro"
Pacerier
@Pacerier Muy bien. Es posible que no haya PHP en el futuro, así que abandonemos este programa de programación y seamos emprendedores o recaudadores de impuestos. Nada es seguro, excepto la muerte y los impuestos, después de todo.
Mark Amery
@ MarkAmery, "No PHP en el futuro" parece estar paranoico por encima del promedio. La historia ha demostrado que los idiomas increíblemente populares no mueren tan fácilmente (¡Fortran!).
Pacerier
1
No seas paranoico. La salida nunca morirá . :)
dolmen
10

Este resultado de https://3v4l.org demuestra que morir y salir son funcionalmente idénticos. ingrese la descripción de la imagen aquí

Simon77
fuente
6

Son esencialmente lo mismo, aunque este artículo sugiere lo contrario.

OK W
fuente
1
Ese artículo es simplemente extraño; a partir de la definición del escáner puede decir que son equivalentes; Si hay alguna diferencia, tal vez la prueba se ejecutó sin un opcache.
Ja͢ck
El artículo trata sobre un punto de referencia que no se puede reproducir ya que el código no se publica. Simplemente ignóralo.
dolmen
0

Funcionalmente, son idénticos. Por lo tanto, elegir cuál usar es una preferencia totalmente personal. Semánticamente en inglés, son diferentes. Morir suena negativo. Cuando tengo una función que devuelve datos JSON al cliente y termina el programa, puede ser horrible si llamo a esta función jsonDie (), y es más apropiado llamarla jsonExit (). Por esa razón, siempre uso salir en lugar de morir.

Luo Jiong Hui
fuente
El OP solo pregunta sobre las funciones de salida y troquel de PHP.
Black Mamba
1
Sí, y solo respondía esa pregunta. Sin embargo, para tener en cuenta, la pregunta no se trata solo de la diferencia en la funcionalidad.
Luo Jiong Hui
Una de las funciones más encantadoras mías se llama pd (), que significa "Por favor muere". Así que no estoy seguro de que morir sea algo malo en ese contexto :)
Ivan Ponomarev
Como desarrollador full stack, no solo me veo a mí mismo como programador, sino también como diseñador de Experiencia de Usuario. Y en este contexto, la simpatía es importante. La simpatía no solo afecta cómo diseño la interfaz de usuario, sino también cómo codifico.
Luo Jiong Hui
0

Por lo que sé cuando miro esta pregunta aquí

Dijo que "en PHP, hay una diferencia clara en la salida del Encabezado. En los ejemplos a continuación, elegí usar un encabezado diferente, pero para mostrar la diferencia entre exit () y die () que no importa", y probado (personalmente)

Dhiva Banyu Wigara
fuente
-3

En w3schools Quiz: ¿las funciones die () y exit () hacen exactamente lo mismo? Mi respuesta es falsa. Esa es una respuesta incorrecta. La respuesta correcta es verdadera.

Aquí está la captura de pantalla: ingrese la descripción de la imagen aquí

li bing zhao
fuente
-5

Algo que he notado en mis scripts al menos es que exit () detendrá el script que se está ejecutando actualmente y pasará el control a cualquier script de llamada, mientras que die detendrá el php en sus pistas. Yo diría que es una gran diferencia?

noowie
fuente
1
@AdarshMadrecha esto no es cierto. Si están dentro o fuera de una subfunción, el script php siempre se detiene.
MERT DOĞAN
-5

El resultado de la función exit () y la función die () es siempre igual. Pero como se explica en la página del manual de alias ( http://php.net/manual/en/aliases.php ), dice que la función die () llama a la función de salida. Creo que está codificado como a continuación:

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

Este no es un problema de rendimiento para proyectos pequeños, medianos y grandes, pero si el proyecto tiene miles de millones de procesos de multiplicación de miles de millones, esto sucede con un estado de optimización de rendimiento muy importante.

Pero la mayoría de la gente no cree que esto sea un problema, porque si tiene tantos procesos, debe pensar en más problemas que si una función es master o alias.

Pero, la respuesta exacta es esa; siempre la función maestra es más rápida que el alias.

Finalmente; La página del manual de alias dice que ya no puede usar el dado. Es solo un alias y está en desuso.

Por lo general, es una mala idea usar este tipo de alias, ya que pueden estar vinculados a la obsolescencia o el cambio de nombre, lo que conducirá a una secuencia de comandos no compatible. Esta lista se proporciona para ayudar a aquellos que desean actualizar sus scripts antiguos a una sintaxis más nueva.

MERT DOĞAN
fuente
2
Aliasing no es 'llamar a una función'. Verifique sus suposiciones antes de elaborar hipótesis.
dolmen
@dolmen Alias ​​siempre llama a las funciones principales en códigos duros. Esta es una regla general de programación.
MERT DOĞAN
@ MERTDOĞAN Un alias no llama a nada. Un alias (en programación o en la vida real) es solo otro nombre de un objeto (que ya tiene un nombre). die()No es una función separada. Es solo otro nombre de exit(). Esta respuesta contiene declaraciones incorrectas sobre alias y su rendimiento.
axiac
docs.php.net/manual/en/… Alias ​​siempre calles como el ejemplo anterior. Aprende algo y vuelve.
MERT DOĞAN
-10

Suenan casi igual, sin embargo, la salida () también le permite configurar el código de salida de su script PHP.

Por lo general, realmente no necesita esto, pero al escribir scripts PHP de consola, es posible que desee verificar, por ejemplo, con Bash, si el script completó todo de la manera correcta.

Luego puede usar exit () y capturarlo más adelante. Die () sin embargo no es compatible con eso.

Die () siempre existe con el código 0. Entonces, esencialmente un comando die () hace lo siguiente:

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

Que es lo mismo que:

<?php
die("I am going to die");
?>
Icheb
fuente
42
Eso no es cierto. diey exitson idénticos (producen el mismo token analizador ( T_EXIT) y se ejecutan con el mismo código). Si el parámetro es un entero, devolverá ese código al shell. Si no es así, lo generará y devolverá 0. Entonces, diey exitson literalmente alias para el otro.
ircmaxell
66
bueno, si sabes que puedes usar exit ("Estoy saliendo ...");
Yuda Prawira
44
¡23 votos positivos hasta ahora para una respuesta que es simplemente falsa! Es por eso que nunca voto sobre las respuestas hasta que he leído todas las respuestas de la pregunta y las entiendo todas (salvo las terriblemente escritas que no puedo entender).
Mark Amery
3
Esto es exactamente lo que @GeoffreyHale escribe en su respuesta. Lo informados a medida que la respuesta es lo que uno esperaría, que viene de un lenguaje como Perl o C. Pero como los otros mencionados es no cierto para php. Realmente podría considerar editar su respuesta para reflejar esto, o eliminarla de lo contrario.
Levite