Jakie są różnice w die () i exit () w PHP?


679

Jakie są różnice między die()iexit() funkcje w PHP?

Myślę, że oba mają tę samą funkcjonalność, ale wątpię, że w obu jest coś innego ... co to jest?


2
exit () po prostu odpisuje program od numerycznego statusu wyjścia, podczas gdy die () wypisuje komunikat o błędzie do stderr i wychodzi ze statusem EXIT_FAILURE. so exit() is exit and die() is also exit :)
Muhammad Shahzad,

Odpowiedzi:


541

Nie ma różnicy - są takie same.

Podręcznik PHP dla exit:

Uwaga: Ta konstrukcja języka jest równoważna z die().

Podręcznik PHP dla die:

Ta konstrukcja języka jest równoważna z exit().


17
Aliasy pozwalają programistom korzystać z tego, który jest wygodny. Pamiętam wyjście lepiej niż śmierć. Niektórzy pamiętają, że lepiej umrzeć niż wyjść.
mauris,

28
to ( php.net/manual/en/aliases.php ) może wyjaśnić, dlaczego 2 funkcje robią to samo
Marek Karbarz,

86
Mimo że robią to samo, zwykle rezerwuję diena zatrzymania związane z błędami i exitna wszystkie inne scenariusze. Po prostu wydaje się płynąć lepiej podczas czytania kodu.
nextgentech

7
Przepraszam, że ożywiłem to, ale przynajmniej dla mnie ... diejest o wiele szybszy do pisania niż exit... Zaczynam używać, exitponieważ jest bardziej czytelny dla programistów spoza PHP, ale diepo prostu szybciej jest pisać, gdy jesteś w pośpiech. Poza tym, pisząc, nie muszę zmieniać pozycji rąk, aby pisać die.
Alejandro Iván

7
@ Mauris, O wiele lepiej jest, aby jedna funkcja miała tylko jedną nazwę . Wyobraź sobie, że każda funkcja PHP ma dwie nazwy, co byłoby kompletnym bałaganem .
Pacerier

221

RÓŻNICA POCHODZENIA

Różnica pomiędzy die()i exit()w PHP jest ich źródłem .


RÓWNOWAŻNIE FUNKCJONALNE

die()i exit()równoważnymi funkcjami.

Podręcznik PHP

Podręcznik PHP dla die:

Ta konstrukcja języka jest równoważna z exit().

Podręcznik PHP dla exit:

Uwaga: Ta konstrukcja języka jest równoważna z die().

Podręcznik PHP dla listy aliasów funkcji :

die jest aliasem dla funkcji master exit()


RÓŻNE W INNYCH JĘZYKACH

die()i exit()różne w innych językach , ale w PHP są one identyczne.

Z jeszcze innej wersji PHP :

... Jako programista C i Perl byłem gotów odpowiedzieć: „Dlaczego, exit () po prostu wysyła programowi numeryczny kod wyjścia, a die () wypisuje komunikat o błędzie na stderr i wychodzi ze statusem EXIT_FAILURE. „ Ale potem przypomniałem sobie, że jesteśmy w brudnej krainie składni PHP.

W PHP exit () i die () są identyczne.

Projektanci najwyraźniej pomyśleli: „Hmm, pożyczmy exit () od C. A ludzie Perla prawdopodobnie polubią to, jeśli weźmiemy die () tak samo jak Perl . Ups! Mamy teraz dwie funkcje wyjścia! Zróbmy to tak, aby oboje może wziąć ciąg lub liczbę całkowitą jako argument i uczynić je identycznymi! "

Rezultat końcowy jest taki, że tak naprawdę wcale nie było to „łatwiejsze”, a bardziej skomplikowane. Kodery C i Perl będą nadal używać exit (), aby podrzucić tylko wartość wyjściową liczby całkowitej, a die (), aby podrzucić komunikat o błędzie i wyjść z błędem. Nowicjusze i osoby znające PHP jako pierwszy język prawdopodobnie będą się zastanawiać: „umm, dwie funkcje wyjścia, z których należy korzystać?” Podręcznik nie wyjaśnia, dlaczego istnieje exit () i die ().

Ogólnie rzecz biorąc, PHP ma wiele takich dziwnych redundancji - stara się być przyjazny dla ludzi pochodzących z różnych środowisk językowych, ale w ten sposób tworzy mylącą redundancję.


14
Mimo że jest to około setna odpowiedź stwierdzająca, że ​​są one równoważne (jak widać również w mojej odpowiedzi ^^), to naprawdę dodaje BARDZO dobrych punktów. Przede wszystkim NIE są one takie same w innych językach (stąd zamieszanie przede wszystkim). (+1)
Lewita

@ Lewit, nie, nie, źle to rozumiesz . Nikt nie jest właścicielem nazw, a różne języki używają tych samych nazw w niecodzienny sposób. W porządku, ponieważ nie potrzebujemy jeszcze jednego standardowego sposobu robienia rzeczy. „Błąd w pierwszej kolejności” wynika z przypisania przez PHP dwóch różnych nazw do jednej funkcji.
Pacerier

2
@Pacerier: Jasne, jeśli spojrzysz na to z punktu „kto to wina”, jest to absolutnie słuszne. Wciąż jest też faktem, że po prostu oznaczają różne rzeczy w kilku językach (co jest w porządku). Patrząc na to z neutralnej perspektywy, z pewnością jest to prawdą: istnieje zamieszanie z powodu różnych znaczeń (nawet jeśli jest to wina php za stworzenie dwóch równych aliasów funkcji). Zdecydowanie nie chciałem wskazywać palcem na żaden z tych języków, jeśli tak rozumiesz mój komentarz ... (great xkcd btw (Y) ^^)
Levite

2
To zdecydowanie powinna być wybrana odpowiedź, dobry opis!
Cody Brown

Inny użytkownik odpowiedział, że exit()nie zamyka połączenia, die()ale wydaje się istotny.
ner0

62

Jak wspomniano wcześniej, te dwa polecenia generują ten sam token analizatora składni.

ALE

Istnieje niewielka różnica, i tak długo trwa parser, aby zwrócić token.

Nie studiowałem parsera PHP, ale jeśli jest to długa lista funkcji zaczynająca się od „d” i krótsza lista zaczynająca się od „e”, to musi istnieć kara czasowa w poszukiwaniu nazwy funkcji dla funkcji zaczynających się od „ mi". Mogą występować inne różnice wynikające z tego, jak sprawdzana jest cała nazwa funkcji.

Wątpię, czy będzie to wymierne, chyba że masz „idealne” środowisko dedykowane do analizowania PHP i wiele żądań o różnych parametrach. Ale musi być różnica, w końcu PHP jest językiem interpretowanym.


4
@Timeless, perfekcjoniści nie powiedzieliby: „PHP jest językiem interpretowanym”. PHP jest językiem, który można interpretować lub kompilować w zależności od konfiguracji serwera.
Pacerier

29
I… „die” to 3 znaki w porównaniu do 4 dla „exit”. Zajmuje więc o 25% mniej pamięci i miejsca na pliki! ;)
Jan Derk

2
„” jeśli jest to długa lista funkcji zaczynająca się od „d” i krótsza lista zaczynająca się od „e”, wówczas musi istnieć kara czasowa w poszukiwaniu nazwy funkcji dla funkcji zaczynających się na „e”. oznacza, że ​​kara czasowa miałaby miejsce przy wyszukiwaniu funkcji zaczynającej się na d ? Zwykle im większa lista, tym dłuższy czas na znalezienie elementu w niej
Pere

9
Jak napisałeś, nie studiowałeś parsera PHP. Dziękujemy za tę bezużyteczną odpowiedź, ponieważ jest oparta na twoich marzeniach na temat implementacji PHP.
dolmen

44

Podręcznik PHP na die :

die - Odpowiednik wyjścia

Możesz nawet zrobić die;to samo, co exit;- z parens lub bez.

Jedyną zaletą wyboru die()ponad exit(), może być Ci oszczędzić czas na wpisanie dodatkowego nas ;-)


1
jest to również wygodne, gdy ktoś pochodzi z innego języka, jeśli ma jakąś znajomość w obu kierunkach
Rohan Khude

Zauważ, że jeśli PHP działa interaktywnie ( php -a) die;, die();, exit;i exit();nie mają żadnego wpływu, natomiast exit(bez średnika) wyjście z trybu interaktywnego.
Santiago arizti,

31

Jak wszystkie inne poprawne odpowiedzi mówią, diei exitsą identyczne / aliasy.

Chociaż mam osobistą konwencję, której używam, gdy chcę zakończyć wykonywanie skryptu, gdy jest to oczekiwane i pożądane exit;. A kiedy muszę zakończyć wykonywanie z powodu pewnych problemów (nie mogę połączyć się z db, nie mogę zapisać do pliku itp.), Używam die("Something went wrong.");do „zabicia” skryptu.

Kiedy korzystam z wyjścia:

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.

Kiedy używam 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 );

W ten sposób, kiedy widzę exitw pewnym momencie mojego kodu, wiem, że w tym momencie chcę wyjść, ponieważ logika kończy się tutaj. Kiedy widzę die, wiem, że chciałbym kontynuować wykonywanie, ale nie mogę lub nie powinienem z powodu błędu w poprzednim wykonaniu.

Oczywiście działa to tylko podczas pracy nad samym projektem. Gdy będzie więcej ludzi, nikt nie będzie im przeszkadzał w użyciu dielub w exitprzypadku, gdy nie będzie to zgodne z moimi konwencjami ...


30

Oto coś, co jest dość interesujące. Chociaż exit()i die()są równoważne, die() zamyka połączenie. exit() nie zamyka połączenia.

die():

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

exit():

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

Wyniki:

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

Wystarczy wziąć to pod uwagę w swoim projekcie.

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


1
To powinna być zaakceptowana odpowiedź.
ner0

2
Tylko przetestowane i exiti diedziałają tak samo, oboje ścisły związek.
Grzegorz Adam Kowalski

12

Pod względem funkcjonalności są identyczne, ale używam ich w następujących scenariuszach, aby kod był czytelny:

Użyj die (), gdy wystąpi błąd i musisz zatrzymać wykonywanie.

na przykład die( 'Oops! Something went wrong' );

Użyj exit (), gdy nie ma błędu i musisz zatrzymać wykonywanie.

na przykład exit( 'Request has been processed successfully!' );


11

Ta strona mówi, że dieto alies exit, więc są identyczne. Ale wyjaśnia również, że:

istnieją funkcje, które zmieniły nazwy z powodu czyszczenia interfejsu API lub z innego powodu, a stare nazwy są zachowywane tylko jako aliasy dla kompatybilności wstecznej. Zazwyczaj używanie tego rodzaju aliasów jest złym pomysłem, ponieważ mogą one wiązać się z przestarzałością lub zmianą nazwy, co doprowadzi do niemożliwego do przeniesienia skryptu.

Nazwij mnie paranoikiem, ale diew przyszłości może nie być .


3
Mówi także, że w niektórych przypadkach nie ma preferowanej nazwy spośród wielu, is_int()i is_integer()są równie dobre na przykład. Patrząc na php-srchistorię zatwierdzeń w GitHub, die()konstrukcja jest w PHP przynajmniej od 1999 roku, kiedy została przekonwertowana na repozytorium SVN i prawdopodobnie tak długo, jak istnieje język. Absurdem wydaje się wyobrażanie sobie, że kiedykolwiek będzie przestarzałe.
Mark Amery

2
@ MarkAmery, chociaż jego założenia nie prowadzą do jego wniosku, sam wniosek jest ważny: ~ „Nazywaj mnie paranoikiem, ale może nie być exitw przyszłości. Lub może nie być diew przyszłości”
Pacerier

@Pacerier Całkiem słusznie. W przyszłości może nie być PHP, więc opuśćmy ten programowy koncert i zostańmy przedsiębiorcami lub poborcami podatków. W końcu nic nie jest pewne, oprócz śmierci i podatków.
Mark Amery

@MarkAmery, „Brak PHP w przyszłości” wydaje się być ponadprzeciętnym paranoikiem. Historia pokazała, że ​​niezwykle popularne języki nie umierają tak łatwo (Fortran!).
Pacerier

1
Nie bądź paranoikiem. wyjście nigdy nie umrze . :)
dolmen


6

Są one zasadniczo takie same, choć ten artykuł sugeruje inaczej.


1
Ten artykuł jest po prostu dziwny; z definicji skanera można stwierdzić, że są one równoważne; jeśli jest jakaś różnica, być może test został przeprowadzony bez opcache.
Ja͢ck

Artykuł dotyczy testu porównawczego, którego nie można odtworzyć, ponieważ kod nie został opublikowany. Po prostu to zignoruj.
dolmen

0

Funkcjonalnie są identyczne. Tak więc wybór, którego użyć, jest całkowicie osobistą preferencją. Semantycznie po angielsku są różne. Die brzmi negatywnie. Gdy mam funkcję zwracającą dane JSON do klienta i kończącą program, może być okropne, jeśli wywołam tę funkcję jsonDie (), a bardziej odpowiednie jest wywołanie jej jsonExit (). Z tego powodu zawsze używam wyjścia zamiast umierać.


OP pyta tylko o funkcje wyjścia z PHP i die.
Black Mamba

1
Tak, a ja odpowiadałem tylko na to pytanie. Należy jednak pamiętać, że pytanie nie dotyczy jedynie różnicy w funkcjonalności.
Luo Jiong Hui

Jedna z moich najpiękniejszych funkcji nazywa się pd () - co oznacza Please Die. Nie jestem więc pewien, czy śmierć w takim kontekście jest zła :)
Ivan Ponomarev

Jako programista z pełnym stosem postrzegam siebie nie tylko jako programistę, ale także jako projektanta User Experience. W tym kontekście ważna jest sympatia. Współczucie wpływa nie tylko na to, jak projektuję interfejs użytkownika, ale także na sposób, w jaki koduję.
Luo Jiong Hui

0

Z tego co wiem, kiedy patrzę na to pytanie tutaj

Napisano tam, że „w PHP istnieje wyraźna różnica w wynikach nagłówka. W poniższych przykładach zdecydowałem się użyć innego nagłówka, ale dla pokazania różnicy między exit () a die (), co nie ma znaczenia”, i przetestowane (osobiście)


-3

W quizie w3schools: Funkcje die () i exit () czy dokładnie to samo? moja odpowiedź jest fałszywa. To nieprawidłowa odpowiedź. Prawidłowa odpowiedź jest prawdziwa.

Oto zrzut ekranu: wprowadź opis zdjęcia tutaj


-5

Zauważyłem w swoich skryptach przynajmniej to, że exit () zatrzyma aktualnie wykonywany skrypt i przekaże kontrolę z powrotem każdemu skryptowi wywołującemu, podczas gdy die zatrzyma php na jego ścieżce. Powiedziałbym, że to całkiem spora różnica?


1
@AdarshMadrecha to nie jest prawda. Jeśli są w podfunkcji lub poza nią, skrypt php zawsze się zatrzymuje.
MERT DOĞAN

-5

Wynik funkcji exit () i die () jest zawsze taki sam. Ale jak wyjaśniono na stronie podręcznika aliasu ( http://php.net/manual/en/aliases.php ), mówi ona, że ​​funkcja die () wywołuje funkcję wyjścia. Myślę, że jest mocno zakodowany, jak poniżej:

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

Nie stanowi to problemu z wydajnością w przypadku małych, średnich i dużych projektów, ale jeśli projekt ma miliardy pomnóż miliardy pomnóż miliardy procesów, dzieje się to bardzo ważny stan optymalizacji wydajności.

Ale większość ludzi nie uważa, że ​​jest to problem, ponieważ jeśli masz tyle procesów, musisz pomyśleć o większym problemie niż w przypadku funkcji nadrzędnej lub aliasu.

Ale dokładna odpowiedź brzmi: funkcja master zawsze jest szybsza niż alias.

Wreszcie; Strona podręcznika Alias mówi, że nie możesz już używać die. To tylko pseudonim i jest przestarzały.

Zazwyczaj używanie tego rodzaju aliasów jest złym pomysłem, ponieważ mogą one wiązać się z przestarzałością lub zmianą nazwy, co doprowadzi do niemożliwego do przeniesienia skryptu. Ta lista ma pomóc tym, którzy chcą uaktualnić swoje stare skrypty do nowszej składni.


2
Aliasing nie oznacza „wywołania funkcji”. Sprawdź swoje założenia przed opracowaniem hipotezy.
dolmen

@dolmen Aliasy zawsze wywołują główne funkcje w twardych kodach. Jest to ogólna zasada programowania.
MERT DOĞAN

@ MERTDOĞAN Alias ​​nic nie dzwoni. Alias ​​(w programowaniu lub w prawdziwym życiu) to po prostu inna nazwa obiektu (który już ma nazwę). die()nie jest osobną funkcją. To tylko inna nazwa exit(). Ta odpowiedź zawiera nieprawidłowe stwierdzenia dotyczące aliasów i ich działania.
axiac

docs.php.net/manual/en/... Aliasy zawsze wywołują połączenia, jak w powyższym przykładzie. Naucz się czegoś i wróć.
MERT DOĞAN

-10

Brzmią mniej więcej tak samo, jednak exit () pozwala również ustawić kod wyjścia skryptu PHP.

Zazwyczaj tak naprawdę nie jest to potrzebne, ale podczas pisania skryptów PHP na konsoli możesz chcieć sprawdzić na przykład Bash, czy skrypt ukończył wszystko poprawnie.

Następnie możesz użyć exit () i złapać to później. Die () jednak tego nie obsługuje.

Die () zawsze istnieje z kodem 0. Zatem w zasadzie polecenie die () wykonuje następujące czynności:

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

Który jest taki sam jak:

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

42
To nieprawda. diei exitsą identyczne (produkują ten sam token analizatora składni ( T_EXIT) i są wykonywane przez ten sam kod). Jeśli parametr jest liczbą całkowitą, zwróci ten kod do powłoki. Jeśli tak nie jest, wyświetli go i zwróci 0. Tak diei exitsą dosłownie aliasami dla siebie.
ircmaxell

6
cóż, jeśli wiesz, że możesz użyć wyjścia („Wychodzę ...”);
Yuda Prawira,

4
Jak dotąd 23 głosy poparcia dla odpowiedzi, która jest po prostu fałszywa! Dlatego nigdy nie głosuję na odpowiedzi, dopóki nie przeczytam wszystkich konkurencyjnych odpowiedzi na pytanie i nie zrozumiem ich wszystkich (z wyjątkiem tych strasznie napisanych, których nie rozumiem).
Mark Amery

3
Właśnie o tym pisze @GeoffreyHale w swojej odpowiedzi. To, co opublikowałeś jako odpowiedź, jest tym, czego można się spodziewać, pochodzącym z języka takiego jak Perl lub C. Ale jak wspomnieli inni, nie jest to prawdą w przypadku php. Naprawdę możesz rozważyć edycję odpowiedzi, aby to odzwierciedlić, lub usunięcie jej w inny sposób.
Lewita,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.