Quali sono le differenze in die () e exit () in PHP?


678

Quali sono le differenze tra die()e le exit()funzioni in PHP?

Penso che entrambi abbiano la stessa funzionalità, ma dubito che ci sia qualcosa di diverso in entrambi ... che cos'è?


2
exit () salva il programma con uno stato di uscita numerico, mentre die () stampa il messaggio di errore su stderr ed esce con lo stato EXIT_FAILURE. so exit() is exit and die() is also exit :)
Muhammad Shahzad,

Risposte:


541

Non c'è differenza: sono uguali.

Manuale PHP per exit:

Nota: questo costrutto linguistico è equivalente a die().

Manuale PHP per die:

Questo costrutto linguistico è equivalente a exit().


17
gli alias consentono ai programmatori di usare quello a loro agio. Ricordo che uscire meglio di morire. Alcuni altri ricordano che muoiono meglio dell'uscita.
mauris,

28
questo ( php.net/manual/en/aliases.php ) potrebbe dare una spiegazione del perché 2 funzioni fanno la stessa cosa
Marek Karbarz,

87
Anche se fanno la stessa cosa, di solito mi riservo diedi soste per errori e exitper tutti gli altri scenari. Sembra che scorra meglio quando si legge il codice.
nextgentech,

7
Mi dispiace ravvivare questo, ma almeno per me ... dieè molto più veloce da scrivere di exit... Sto iniziando a usare exitperché è più leggibile per i programmatori non PHP, ma dieè solo più veloce da scrivere quando ci si trova una fretta. Inoltre, per come scrivo, non devo cambiare la posizione delle mani per scrivere die.
Alejandro Iván,

7
@mauris, È meglio che una funzione abbia un solo nome . Immagina che ogni funzione PHP abbia due nomi, sarebbe un casino completo .
Pacerier,

222

DIFFERENZA IN ORIGINE

La differenza tra die()e exit()in PHP è la loro origine .


FUNZIONALMENTE EQUIVALENTE

die()e exit()sono funzioni equivalenti.

Manuale PHP

Manuale PHP per die:

Questo costrutto linguistico è equivalente a exit().

Manuale PHP per exit:

Nota: questo costrutto linguistico è equivalente a die().

Manuale PHP per elenco di alias di funzioni :

die è un alias per la funzione principale exit()


DIVERSO IN ALTRE LINGUE

die()e exit()sono diversi in altre lingue ma in PHP sono identici.

Da l' ennesimo rant PHP :

... Come programmatore C e Perl, ero pronto a rispondere, "Why, exit () salva il programma con uno stato di uscita numerico, mentre die () stampa il messaggio di errore su stderr ed esce con lo stato EXIT_FAILURE. " Ma poi mi sono ricordato che siamo nella terra della sintassi disordinata di PHP.

In PHP, exit () e die () sono identici.

I progettisti ovviamente hanno pensato "Hmm, prendiamo in prestito exit () da C. E probabilmente alla gente di Perl piacerà se prendiamo die () come lo è anche di Perl . Oops! Ora abbiamo due funzioni di uscita! Facciamo in modo che entrambi può prendere una stringa o un numero intero come argomento e renderli identici! "

Il risultato finale è che ciò non ha reso le cose "più facili", solo più confuse. I programmatori C e Perl continueranno a usare exit () per lanciare solo un valore di uscita intero e die () per lanciare un messaggio di errore e uscire con un errore. I neofiti e le persone con PHP come prima lingua probabilmente si chiederanno "umm, due funzioni di uscita, quale dovrei usare?" Il manuale non spiega perché c'è exit () e die ().

In generale, PHP ha molta ridondanza strana come questa: cerca di essere amichevole con persone che provengono da contesti linguistici diversi, ma mentre lo fa, crea ridondanza confusa.


14
Anche se si tratta della centesima risposta affermando che sono equivalenti (come si vede anche nella mia risposta ^^), questo aggiunge davvero alcuni punti MOLTO buoni. Soprattutto che NON sono gli stessi in altre lingue (quindi la confusione in primo luogo). (+1)
Levita,

@Levit, No, no, stai sbagliando completamente . Nessuno possiede nomi e lingue diverse riutilizzano gli stessi nomi in modi diversi. Va bene perché non abbiamo bisogno di un altro modo standard di fare le cose. La "confusione in primo luogo" è dovuta al fatto che PHP assegna due nomi diversi a una funzione.
Pacerier,

2
@Pacerier: Certo, se lo guardi dal punto di "chi è la colpa", è assolutamente giusto. Tuttavia è anche un dato di fatto che significano semplicemente cose diverse in diverse lingue (il che è ok). Guardandolo da una prospettiva neutrale, è assolutamente vero: c'è confusione a causa dei diversi significati (anche se è colpa di php per la creazione di due alias di uguale funzione). Sicuramente non volevo puntare il dito su nessuna di quelle lingue, se era quello che hai capito dal mio commento ... (ottimo xkcd btw (Y) ^^)
Levite

2
Questa dovrebbe essere sicuramente la risposta scelta, una buona descrizione!
Cody Brown,

Un altro utente ha risposto che exit()non chiude la connessione mentre lo die()fa, sembra rilevante.
ner0

62

Come affermato in precedenza, questi due comandi producono lo stesso token parser.

MA

C'è una piccola differenza, ed è quanto tempo impiega il parser a restituire il token.

Non ho studiato il parser PHP, ma se è un lungo elenco di funzioni che iniziano con "d" e un elenco più breve che inizia con "e", allora deve esserci una penalità di tempo che cerca il nome della funzione per le funzioni che iniziano con " e". E potrebbero esserci altre differenze dovute al modo in cui viene controllato l'intero nome della funzione.

Dubito che sarà misurabile a meno che tu non abbia un ambiente "perfetto" dedicato all'analisi di PHP e molte richieste con parametri diversi. Ma deve esserci una differenza, dopo tutto, PHP è un linguaggio interpretato.


4
@Timeless, i perfezionisti non direbbero "PHP è un linguaggio interpretato". PHP è una lingua che può essere interpretata o compilata a seconda della configurazione del server.
Pacerier,

29
E ... "die" è lungo 3 caratteri contro 4 per "exit". Quindi occupa il 25% in meno di memoria e spazio per i file! ;)
Jan Derk,

2
'"se è un lungo elenco di funzioni che iniziano con" d "e un elenco più breve che inizia con" e ", allora deve esserci una penalità di tempo che cerca il nome della funzione per le funzioni che iniziano con" e "". significa che la penalità di tempo si verificherebbe quando si cerca la funzione che inizia con d ? Di solito, più grande è l'elenco, più lungo è il tempo di trovare un oggetto al suo interno.
Pere

9
Come hai scritto, non hai studiato il parser PHP. Grazie per questa risposta inutile poiché si basa sui tuoi sogni su come viene implementato PHP.
dolmen,

44

Manuale PHP su die :

die - Equivalente per uscire

Puoi anche fare die;allo stesso modo di exit;- con o senza parentesi.

L'unico vantaggio di scegliere die()oltre exit(), potrebbe essere il tempo che dedichi a scrivere una lettera in più ;-)


1
è anche comodo quando qualcuno viene da un'altra lingua, se hanno una certa familiarità in entrambi i modi
Rohan Khude,

Si noti che se si esegue PHP in modo interattivo ( php -a) die;, die();, exit;e exit();non hanno alcun effetto, mentre exit(senza virgola) esce modalità interattiva.
santiago arizti,

31

Come tutte le altre risposte corrette dicono, diee exitsono identici / alias.

Sebbene io abbia una convenzione personale secondo cui quando voglio terminare l'esecuzione di uno script quando è previsto e desiderato, lo uso exit;. E quando devo terminare l'esecuzione a causa di alcuni problemi (non riesco a collegarmi a db, non riesco a scrivere su file ecc.), Uso die("Something went wrong.");"uccidere" lo script.

Quando 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.

Quando uso 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 );

In questo modo, quando vedo exitad un certo punto del mio codice, so che a questo punto voglio uscire perché la logica finisce qui. Quando vedo die, so che mi piacerebbe continuare l'esecuzione, ma non posso o non dovrei a causa di un errore nell'esecuzione precedente.

Naturalmente questo funziona solo quando si lavora su un progetto da solo. Quando c'è più gente nessuno potrà impedire loro di usare dieo exitdove non si adatta alle mie convenzioni ...


30

Ecco qualcosa di piuttosto interessante. Sebbene exit()e die()siano equivalenti, die() chiude la connessione. exit() non chiude la connessione.

die():

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

exit():

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

risultati:

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

In caso di necessità, devi tenerne conto per il tuo progetto.

Crediti: https://stackoverflow.com/a/20932511/4357238


1
Questa dovrebbe essere la risposta accettata.
ner0

2
Ho appena provato exite diefunzionano allo stesso modo, entrambi chiudono la connessione.
Grzegorz Adam Kowalski,

12

Dal punto di vista funzionale, sono identici ma li utilizzo nei seguenti scenari per rendere leggibile il codice:

Usa die () quando c'è un errore e devi fermare l'esecuzione.

per esempio die( 'Oops! Something went wrong' );

Usa exit () quando non c'è un errore e devi interrompere l'esecuzione.

per esempio exit( 'Request has been processed successfully!' );


11

Questa pagina dice che dieè un alleato di exit, quindi sono identici. Ma spiega anche che:

ci sono funzioni che hanno cambiato i nomi a causa di una pulizia dell'API o per qualche altro motivo e i vecchi nomi sono mantenuti solo come alias per la compatibilità con le versioni precedenti. Di solito è una cattiva idea usare questo tipo di alias, poiché potrebbero essere legati all'obsolescenza o alla ridenominazione, il che porterà a script non portabili.

Quindi, chiamami paranoico, ma potrebbe non esserci dieing in futuro.


3
Dice anche che in alcuni casi non esiste un nome preferito tra quelli multipli, is_int()e is_integer()sono ugualmente buoni per esempio. Guardando la php-srccronologia dei commit su GitHub, il die()costrutto è stato in PHP almeno dal 1999 quando è stato convertito in un repository SVN, e probabilmente per tutto il tempo in cui il linguaggio è esistito. Sembra assurdo immaginare che sarà mai deprecato.
Mark Amery,

2
@MarkAmery, Mentre le sue premesse non portano alla sua conclusione, la conclusione stessa è valida: ~ "Chiamami paranoico, ma potrebbe non esserci exitin futuro. O potrebbe non esserci diein futuro"
Pacerier,

@Pacerier Abbastanza bene. In futuro potrebbe non esserci PHP, quindi lasciamo tutti questo concerto di programmazione e diventiamo becchini o esattori delle tasse. Nulla è certo se non morte e tasse, dopo tutto.
Mark Amery,

@MarkAmery, "Nessun PHP in futuro" sembra essere paranoico sopra la media. La storia ha dimostrato che le lingue follemente popolari non muoiono così facilmente (Fortran!).
Pacerier,

1
Non essere paranoico. l'uscita non morirà mai . :)
dolmen


6

Sono essenzialmente gli stessi, sebbene questo articolo suggerisca diversamente.


1
Quell'articolo è semplicemente strano; dalla definizione dello scanner si può dire che sono equivalenti; se c'è qualche differenza, forse il test è stato eseguito senza opcache.
Ja͢ck,

L'articolo riguarda un benchmark che non può essere riprodotto in quanto il codice non è pubblicato. Ignoralo.
dolmen,

0

Funzionalmente, sono identici. Quindi scegliere quale utilizzare è una preferenza totalmente personale. Semanticamente in inglese, sono diversi. Die sembra negativo. Quando ho una funzione che restituisce i dati JSON al client e termina il programma, può essere terribile se chiamo questa funzione jsonDie (), ed è più appropriato chiamarla jsonExit (). Per questo motivo, uso sempre exit invece di die.


L'OP chiede solo le funzioni di uscita e di morte di PHP.
Black Mamba

1
Sì, e stavo rispondendo solo a quella domanda. Tuttavia, la domanda non riguarda solo la differenza di funzionalità.
Luo Jiong Hui,

Una delle mie funzioni più adorabili si chiama pd () - Il che significa Please Die. Quindi non sono sicuro che morire sia un male in un simile contesto :)
Ivan Ponomarev,

Come sviluppatore full stack, non mi vedo solo come programmatore, ma anche come designer di User Experience. E in questo contesto, la simpatia è importante. La simpatia non influenza solo il modo in cui progetto l'interfaccia utente, ma anche il modo in cui codifico.
Luo Jiong Hui,

0

Da quello che so quando guardo questa domanda qui

Ha detto che "in PHP, c'è una differenza netta nell'output Header. Negli esempi seguenti ho scelto di usare un'intestazione diversa, ma per mostrare la differenza tra exit () e die () che non ha importanza", e testato (personalmente)


-3

In w3schools Quiz: le funzioni die () e exit () fanno esattamente la stessa cosa? la mia risposta è falsa. Questa è una risposta errata. La risposta giusta è vera.

Ecco lo screenshot: inserisci qui la descrizione dell'immagine


-5

Qualcosa che ho notato almeno nei miei script è che exit () interromperà lo script attualmente in esecuzione e restituirà il controllo a qualsiasi script chiamante, mentre die interromperà php nelle sue tracce. Direi che è una differenza abbastanza grande?


1
@AdarshMadrecha questo non è vero. Se si trovano all'interno o all'esterno di una sottofunzione, lo script php si interrompe sempre.
MERT DOĞAN,

-5

Il risultato della funzione exit () e die () è sempre lo stesso. Ma come spiegato nella pagina del manuale alias ( http://php.net/manual/en/aliases.php ), dice che la funzione die () chiama la funzione exit. Penso che sia hard coded come di seguito:

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

Questo non è un problema di prestazioni per progetti di piccole, medie e grandi dimensioni, ma se il progetto ha miliardi moltiplicare miliardi moltiplicare miliardi di processi, ciò accade in uno stato di ottimizzazione delle prestazioni molto importante.

Ma la maggior parte delle persone non pensa che questo sia un problema, perché se hai molti processi, devi pensare a più problemi che se una funzione è master o alias.

Ma la risposta esatta è quella; la funzione principale è sempre più veloce dell'alias.

Finalmente; La pagina del manuale di Alias dice che non puoi più usare die. È solo un alias ed è deprecato.

Di solito è una cattiva idea usare questo tipo di alias, poiché potrebbero essere legati all'obsolescenza o alla ridenominazione, il che porterà a script non portabili. Questo elenco viene fornito per aiutare coloro che desiderano aggiornare i loro vecchi script alla sintassi più recente.


2
L'aliasing non è "chiamare una funzione". Controlla i tuoi presupposti prima di elaborare le ipotesi.
dolmen,

@dolmen Alias ​​chiama sempre le funzioni principali in codici fissi. Questa è una regola di programmazione generale.
MERT DOĞAN,

@ MERTDOĞAN Un alias non chiama nulla. Un alias (nella programmazione o nella vita reale) è solo un altro nome di un oggetto (che ha già un nome). die()non è una funzione separata. È solo un altro nome di exit(). Questa risposta contiene dichiarazioni errate sugli alias e sulle loro prestazioni.
axiac

docs.php.net/manual/en/… Gli alias chiamano sempre come sopra esempio. Impara qualcosa e torna indietro.
MERT DOĞAN,

-10

Suonano allo stesso modo, tuttavia, exit () consente anche di impostare il codice di uscita dello script PHP.

Di solito non ti serve davvero, ma quando scrivi gli script PHP della console, potresti voler verificare, ad esempio, con Bash se lo script ha completato tutto nel modo giusto.

Quindi puoi usare exit () e prenderlo in seguito. Die () tuttavia non lo supporta.

Die () esiste sempre con il codice 0. Quindi essenzialmente un comando die () fa quanto segue:

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

Che è lo stesso di:

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

42
Non è vero. diee exitsono identici (producono lo stesso token parser ( T_EXIT) e vengono eseguiti dallo stesso codice). Se il parametro è un numero intero, restituirà quel codice alla shell. In caso contrario, verrà generato e restituirà 0. Quindi diee exitsono letteralmente alias l'uno per l'altro.
ircmaxell,

6
bene se sai che puoi usare exit ("Sto uscendo ...");
Yuda Prawira,

4
23 voti finora per una risposta semplicemente falsa! Questo è il motivo per cui non voto mai sulle risposte fino a quando non ho letto tutte le risposte concorrenti alla domanda e le ho capite tutte (salvo quelle terribilmente scritte che non riesco a capire).
Mark Amery,

3
Questo è esattamente ciò di cui scrive @GeoffreyHale nella sua risposta. Quello che avete inviato in risposta è quello che ci si aspetterebbe, proveniente da un linguaggio come Perl o C. Ma come gli altri dicono che è non è vero per php. Potresti davvero prendere in considerazione la modifica della tua risposta per rispecchiarla o eliminarla in altro modo.
Levita,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.