Quelles sont les différences entre die () et exit () en PHP?

678

Quelles sont les différences entre die()et les exit()fonctions en PHP?

Je pense que les deux ont la même fonctionnalité, mais je doute qu'il y ait quelque chose de différent dans les deux ... qu'est-ce que c'est?

coderex
la source
2
exit () met simplement fin au programme avec un état de sortie numérique, tandis que die () affiche le message d'erreur sur stderr et quitte avec l'état EXIT_FAILURE. so exit() is exit and die() is also exit :)
Muhammad Shahzad

Réponses:

541

Il n'y a pas de différence - ce sont les mêmes.

Manuel PHP pour exit:

Remarque: Cette construction de langage est équivalente à die().

Manuel PHP pour die:

Cette construction de langage est équivalente à exit().

Marek Karbarz
la source
17
Les alias permettent aux programmeurs d'utiliser celui qui leur convient. Je me souviens mieux de sortir que de mourir. D'autres se souviennent de mieux mourir que de sortir.
mauris
28
cela ( php.net/manual/en/aliases.php ) pourrait expliquer pourquoi 2 fonctions font la même chose
Marek Karbarz
87
Même s'ils font la même chose, je réserve généralement diedes arrêts liés aux erreurs et exitpour tous les autres scénarios. Il semble simplement mieux circuler lors de la lecture du code.
nextgentech
7
Désolé de faire revivre cela, mais au moins pour moi ... dieest beaucoup plus rapide à écrire que exit... je commence à utiliser exitparce qu'il est plus lisible pour les programmeurs non PHP, mais dieest juste plus rapide à taper lorsque vous êtes pressé. De plus, par la façon dont je tape, je n'ai pas à changer la position de mes mains pour écrire die.
Alejandro Iván
7
@mauris, Il est préférable qu'une seule fonction ait un seul nom . Imaginez que chaque fonction PHP ait deux noms, ce serait un gâchis complet .
Pacerier
222

DIFFÉRENCE D'ORIGINE

La différence entre PHP die()et exit()PHP est leur origine .


ÉQUIVALENT FONCTIONNEL

die()et exit()sont des fonctions équivalentes.

Manuel PHP

Manuel PHP pour die:

Cette construction de langage est équivalente à exit().

Manuel PHP pour exit:

Remarque: Cette construction de langage est équivalente à die().

Manuel PHP pour la liste des alias de fonction :

die est un alias pour la fonction maître exit()


DIFFÉRENT DANS D'AUTRES LANGUES

die()et exit()sont différents dans d'autres langages mais en PHP ils sont identiques.

De Encore une autre diatribe PHP :

... En tant que codeur C et Perl, j'étais prêt à répondre: "Pourquoi, exit () met simplement fin au programme avec un état de sortie numérique, tandis que die () imprime le message d'erreur à stderr et se termine avec l'état EXIT_FAILURE. " Mais ensuite, je me suis souvenu que nous étions dans la terre à syntaxe désordonnée de PHP.

En PHP, exit () et die () sont identiques.

Les concepteurs ont évidemment pensé "Hmm, empruntons la sortie () de C. Et les gens de Perl l'aimeront probablement si nous prenons die () comme de Perl aussi. Oups! Nous avons maintenant deux fonctions de sortie! peut prendre une chaîne ou un entier comme argument et les rendre identiques! "

Le résultat final est que cela n'a pas vraiment rendu les choses "plus faciles", juste plus confuses. Les codeurs C et Perl continueront d'utiliser exit () pour lancer une valeur de sortie entière uniquement, et die () pour lancer un message d'erreur et quitter avec un échec. Les débutants et les personnes utilisant PHP comme première langue se demanderont probablement "umm, deux fonctions de sortie, laquelle dois-je utiliser?" Le manuel n'explique pas pourquoi il y a exit () et die ().

En général, PHP a beaucoup de redondances étranges comme celle-ci - il essaie d'être convivial avec des gens qui viennent d'horizons linguistiques différents, mais ce faisant, il crée une redondance déroutante.

Geoffrey Hale
la source
14
Même s'il s'agit de la 100e réponse indiquant qu'ils sont équivalents (comme on le voit également dans ma réponse ^^), cela ajoute vraiment de très bons points. Surtout qu'ils ne sont PAS les mêmes dans d'autres langues (d'où la confusion en premier lieu). (+1)
Lévite
@Levit, non, non, vous vous trompez totalement . Personne ne possède de noms et différentes langues ne réutilisent les mêmes noms de manière inégalée. C'est bien parce que nous n'avons pas encore besoin d' une autre façon standard de faire les choses. La "confusion en premier lieu" est due au fait que PHP attribue deux noms différents à une fonction.
Pacerier
2
@Pacerier: Bien sûr, si vous le regardez du point de vue de "qui est la faute", c'est tout à fait vrai. C'est aussi un fait qu'ils signifient simplement des choses différentes dans plusieurs langues (ce qui est correct). En le regardant d'un point de vue neutre, cela est définitivement vrai: il y a de la confusion à cause des différentes significations (même si c'est la faute de php pour avoir créé deux alias de fonctions égales). Je ne voulais définitivement pas pointer du doigt l'une de ces langues, si c'est ce que vous avez compris dans mon commentaire ... (super xkcd btw (Y) ^^)
Lévite
2
Cela devrait certainement être la réponse choisie, bonne description!
Cody Brown
Un autre utilisateur a répondu qu'il exit()ne ferme pas la connexion alors que die()cela semble pertinent.
ner0
62

Comme indiqué précédemment, ces deux commandes produisent le même jeton d'analyse.

MAIS

Il y a une petite différence, et c'est le temps qu'il faut à l'analyseur pour retourner le jeton.

Je n'ai pas étudié l'analyseur PHP, mais s'il s'agit d'une longue liste de fonctions commençant par "d" et d'une liste plus courte commençant par "e", il doit y avoir une pénalité de temps en recherchant le nom de la fonction pour les fonctions commençant par " e ". Et il peut y avoir d'autres différences en raison de la façon dont le nom de la fonction entière est vérifiée.

Je doute qu'il sera mesurable à moins que vous ayez un environnement "parfait" dédié à l'analyse PHP, et beaucoup de requêtes avec des paramètres différents. Mais il doit y avoir une différence, après tout, PHP est un langage interprété.

Bob
la source
4
@Timeless, les perfectionnistes ne diraient pas "PHP est un langage interprété". PHP est un langage qui peut être interprété ou compilé en fonction de la configuration de votre serveur.
Pacerier
29
Et ... "mourir" est long de 3 caractères contre 4 pour "sortir". Il faut donc 25% moins de mémoire et d'espace de fichiers! ;)
Jan Derk
2
'"s'il s'agit d'une longue liste de fonctions commençant par" d "et d'une liste plus courte commençant par" e ", il doit y avoir une pénalité de temps lors de la recherche du nom de la fonction pour les fonctions commençant par" e "'. signifie que la pénalité de temps se produirait lors de la recherche de la fonction commençant par d ? Habituellement, plus la liste est longue, plus le temps pour y trouver un élément est long.
Pere
9
Comme vous l'avez écrit, vous n'avez pas étudié l'analyseur PHP. Merci pour cette réponse inutile car elle est basée sur vos rêves sur la façon dont PHP est implémenté.
dolmen le
44

Manuel PHP sur die :

mourir - Équivalent à sortir

Vous pouvez même faire die;la même chose que exit;- avec ou sans parens.

Le seul avantage de choisir die()plus exit(), peut - être le temps que vous épargnerez à taper une lettre supplémentaire ;-)

lévite
la source
1
cela est également pratique lorsque quelqu'un vient d'une autre langue, s'il
acquiert une
Notez que si interactive ( en cours d' exécution php php -a) die;, die();, exit;et exit();n'a pas d' effet, alors que exit(sans virgule) quitte le mode interactif.
santiago arizti
31

Comme le disent toutes les autres bonnes réponses, dieet exitsont identiques / alias.

Bien que j'aie une convention personnelle selon laquelle lorsque je veux terminer l'exécution d'un script quand il est attendu et souhaité, j'utilise exit;. Et lorsque j'ai besoin de terminer l'exécution en raison de certains problèmes (impossible de se connecter à db, impossible d'écrire dans un fichier, etc.), j'utilise die("Something went wrong.");pour "tuer" le script.

Lorsque j'utilise 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.

Quand j'utilise 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 );

De cette façon, quand je vois exità un moment donné dans mon code, je sais qu'à ce stade, je veux quitter parce que la logique se termine ici. Quand je vois die, je sais que j'aimerais continuer l'exécution, mais je ne peux pas ou ne devrais pas en raison d'une erreur lors de l'exécution précédente.

Bien sûr, cela ne fonctionne que lorsque vous travaillez sur un projet seul. Quand il y a plus de monde personne ne les empêchera d'utiliser dieou exitlà où ça ne correspond pas à mes conventions ...

Lukas
la source
30

Voici quelque chose d'assez intéressant. Bien que exit()et die()soient équivalents, die() ferme la connexion. exit() ne ferme pas la connexion.

die():

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

exit():

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

Résultats:

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

Au cas où vous en auriez besoin pour votre projet.

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

Edward
la source
1
Ce devrait être la réponse acceptée.
ner0
2
Il suffit de le tester exitet de dietravailler de la même manière, ils ont tous deux une connexion étroite.
Grzegorz Adam Kowalski
12

Côté fonctionnalité, ils sont identiques mais je les utilise dans les scénarios suivants pour rendre le code lisible:

Utilisez die () en cas d'erreur et arrêtez l'exécution.

par exemple die( 'Oops! Something went wrong' );

Utilisez exit () lorsqu'il n'y a pas d'erreur et devez arrêter l'exécution.

par exemple exit( 'Request has been processed successfully!' );

aagjalpankaj
la source
11

Cette page dit dieest un allié de exit, donc ils sont identiques. Mais explique également que:

il existe des fonctions qui ont changé de nom à cause d'un nettoyage de l'API ou pour une autre raison et les anciens noms ne sont conservés que comme alias pour la compatibilité descendante. C'est généralement une mauvaise idée d'utiliser ce type d'alias, car ils peuvent être liés à l'obsolescence ou au changement de nom, ce qui conduira à un script non transférable.

Alors, appelez-moi paranoïaque, mais il n'y aura peut-être plus rien dieà l'avenir.

Pedram Behroozi
la source
3
Il indique également Dans certains cas, il n'y a pas de nom préféré parmi les multiples, is_int()et is_integer()sont également bons par exemple. En regardant l' php-srchistorique des validations sur GitHub, la die()construction est en PHP au moins depuis 1999 quand elle a été convertie en un dépôt SVN, et probablement aussi longtemps que le langage a existé. Il semble absurde d’imaginer qu’elle sera un jour dépréciée.
Mark Amery
2
@MarkAmery, Bien que ses prémisses ne mènent pas à sa conclusion, la conclusion elle-même est valide: ~ "Appelez-moi paranoïaque, mais il n'y en aura peut-être pas exità l'avenir. Ou il n'y en aura peut-être pas dieà l'avenir"
Pacerier
@Pacerier Tout à fait raison. Il n'y aura peut-être pas de PHP à l'avenir, alors quittons tous ce concert de programmation et devenons des entrepreneurs de pompes funèbres ou des collecteurs d'impôts. Rien n'est certain que la mort et les impôts, après tout.
Mark Amery
@MarkAmery, "No PHP in the future" semble être au-dessus de la moyenne paranoïaque. L'histoire a montré que les langues incroyablement populaires ne s'éteignent pas aussi facilement (Fortran!).
Pacerier
1
Ne soyez pas paranoïaque. la sortie ne mourra jamais . :)
dolmen
6

Ils sont essentiellement les mêmes, bien que cet article suggère le contraire.

ok
la source
1
Cet article est juste bizarre; à partir de la définition du scanner, vous pouvez dire qu'ils sont équivalents; s'il y a une différence, peut-être que le test a été exécuté sans opcache.
Ja͢ck
L'article concerne un benchmark qui ne peut pas être reproduit car le code n'est pas publié. N'y faites pas attention.
dolmen le
0

Fonctionnellement, ils sont identiques. Donc, choisir lequel utiliser est totalement une préférence personnelle. Sémantiquement en anglais, ils sont différents. Die semble négatif. Lorsque j'ai une fonction qui renvoie des données JSON au client et termine le programme, cela peut être horrible si j'appelle cette fonction jsonDie (), et il est plus approprié de l'appeler jsonExit (). Pour cette raison, j'utilise toujours exit au lieu de die.

Luo Jiong Hui
la source
L'OP pose des questions sur les fonctions de sortie et de fin de PHP uniquement.
Black Mamba
1
Oui, et je ne répondais qu'à cette question. Pour être conscient cependant, la question ne concerne pas uniquement la différence de fonctionnalité.
Luo Jiong Hui
L'une de mes plus belles fonctions s'appelle pd () - ce qui signifie Please Die. Donc je ne suis pas sûr que mourir soit une mauvaise chose dans un tel contexte :)
Ivan Ponomarev
En tant que développeur full stack, je ne me vois pas seulement en tant que programmeur, mais aussi en tant que concepteur d'expérience utilisateur. Et dans ce contexte, la sympathie est importante. La sympathie affecte non seulement la façon dont je conçois l'interface utilisateur, mais aussi la façon dont je code.
Luo Jiong Hui
0

D'après ce que je sais quand je regarde cette question ici

Il y est dit que "en PHP, il y a une différence distincte dans la sortie de l'en-tête. Dans les exemples ci-dessous, j'ai choisi d'utiliser un en-tête différent mais pour montrer la différence entre exit () et die () qui n'a pas d'importance", et testé (personnellement)

Dhiva Banyu Wigara
la source
-3

Dans w3schools Quiz: les fonctions die () et exit () font exactement la même chose? ma réponse est fausse. C'est une mauvaise réponse. La bonne réponse est vraie.

Voici la capture d'écran: entrez la description de l'image ici

li bing zhao
la source
-5

Quelque chose que j'ai remarqué dans mes scripts au moins, c'est que exit () arrêtera le script en cours d'exécution et renverra le contrôle à tout script appelant, tandis que die arrêtera php sur ses traces. Je dirais que c'est une grosse différence?

noowie
la source
1
@AdarshMadrecha ce n'est pas vrai. S'ils se trouvent à l'intérieur ou à l'extérieur d'une sous-fonction, le script php s'arrête toujours.
MERT DOĞAN
-5

Le résultat de la fonction exit () et de la fonction die () est toujours le même. Mais comme expliqué dans la page de manuel d'alias ( http://php.net/manual/en/aliases.php ), il est dit que la fonction die () appelle la fonction exit. Je pense qu'il est codé en dur comme ci-dessous:

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

Ce n'est pas un problème de performances pour les petits, moyens et grands projets, mais si le projet a des milliards, des milliards, des milliards, des milliards, des processus, cela se produit dans un état d'optimisation des performances très important.

Mais la plupart des gens ne pensent pas que c'est un problème, car si vous avez autant de processus, vous devez penser plus de problème que si une fonction est maître ou alias.

Mais, la réponse exacte est que; la fonction master allways est plus rapide que l'alias.

Finalement; La page de manuel Alias indique que vous ne pouvez plus utiliser le dé. Ce n'est qu'un alias et il est obsolète.

C'est généralement une mauvaise idée d'utiliser ce type d'alias, car ils peuvent être liés à l'obsolescence ou au changement de nom, ce qui conduira à un script non transférable. Cette liste est fournie pour aider ceux qui souhaitent mettre à jour leurs anciens scripts vers une syntaxe plus récente.

MERT DOĞAN
la source
2
Le crénelage ne signifie pas «appeler une fonction». Vérifiez vos hypothèses avant d'élaborer une hypothèse.
dolmen le
@dolmen Aliases appelle toujours les fonctions principales dans les codes durs. Il s'agit d'une règle de programmation générale.
MERT DOĞAN le
@ MERTDOĞAN Un alias n'appelle rien. Un alias (en programmation ou dans la vie réelle) n'est qu'un autre nom d'un objet (qui a déjà un nom). die()n'est pas une fonction distincte. C'est juste un autre nom de exit(). Cette réponse contient des déclarations incorrectes sur les alias et leurs performances.
axiac
docs.php.net/manual/en/… Les alias appellent toujours comme l'exemple ci-dessus. Apprenez quelque chose et revenez.
MERT DOĞAN
-10

Ils sonnent à peu près de la même manière, cependant, la sortie () vous permet également de définir le code de sortie de votre script PHP.

Habituellement, vous n'en avez pas vraiment besoin, mais lorsque vous écrivez des scripts PHP de console, vous voudrez peut-être vérifier avec Bash par exemple si le script a tout terminé correctement.

Ensuite, vous pouvez utiliser exit () et rattraper cela plus tard. Die () ne supporte cependant pas cela.

Die () existe toujours avec le code 0. Donc essentiellement une commande die () fait ce qui suit:

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

C'est la même chose que:

<?php
die("I am going to die");
?>
Icheb
la source
42
Ce n'est pas vrai. dieet exitsont identiques (ils produisent le même jeton analyseur ( T_EXIT) et sont exécutés par le même code). Si le paramètre est un entier, il renverra ce code au shell. Si ce n'est pas le cas, il le restitue et renvoie 0. Donc die, ce exitsont littéralement des alias les uns pour les autres.
ircmaxell
6
eh bien si vous savez que vous pouvez utiliser exit ("Je sors ...");
Yuda Prawira
4
23 votes positifs jusqu'à présent pour une réponse tout simplement fausse! C'est pourquoi je ne vote jamais sur les réponses tant que je n'ai pas lu toutes les réponses concurrentes à la question et que je ne les comprends pas toutes (sauf celles terriblement écrites que je ne comprends pas).
Mark Amery
3
C'est exactement ce que @GeoffreyHale écrit dans sa réponse. Ce que vous avez posté comme réponse est ce à quoi on pourrait s'attendre, venant d'une langue comme Perl ou C. Mais comme les autres l'ont mentionné, ce n'est pas vrai pour php. Vous pourriez vraiment envisager de modifier votre réponse pour refléter cela, ou de la supprimer autrement.
Lévite