exit, exit (), exit (0), die (), die (0) - Jak wyjść ze skryptu

81

Uważam, że wszystkie (a nawet die()lub die(0)) są identyczne. Jeśli nie są identyczne, co jest preferowane w przypadku pomyślnego zakończenia skryptu? Jeśli są identyczne, czy istnieje preferowany standard wskazujący na pomyślne ukończenie skryptu? Zwykle używam exit;.

EDYCJA: Wszystkie odpowiedzi mają „ die()i exit()są identyczne”, mimo że mówię to w moim pytaniu. Zaktualizowałem tytuł, aby, mam nadzieję, wyjaśnić, że to NIE jest moje pytanie. Chcę wyraźnie wskazać sukces ze skryptu wiersza poleceń.

Pigułki wybuchowe
źródło
4
Uważam, że są identyczne stackoverflow.com/questions/1795025/…
Doug Owings,
nie używaj żadnego z nich ... po prostu użyj kombinacji echa i powrotu.
2
@HiroProtagonist całkowicie się nie zgadzam; returnma inną konsekwencję
Explosion Pills,

Odpowiedzi:

67

Wszystkie są identyczne. Jestem prawie pewien, że die()jest to zwykły alias do exit(), ale nawet jeśli nie jest, nadal działa identycznie.

Gdy jednej z tych funkcji podano argument w postaci łańcucha, przed zakończeniem procesu wypisuje łańcuch. Kiedy napotka liczbę całkowitą poniżej 255, ta liczba jest uważana za kod zwrotny procesu, który jest przekazywany z powrotem do procesu, który wywołał skrypt PHP. Jest to szczególnie przydatne podczas pisania aplikacji uruchamianych z wiersza poleceń (PHP nie jest dostępne tylko w Internecie!).

Jeśli chodzi o różnicę między exit, exit()i exit(0), tak naprawdę nie ma. Zdecydowanie nie ma różnicy między pierwszymi dwoma, ponieważ exitjest technicznie konstrukcją językową, a nie funkcją, więc można ją wywołać z nawiasami lub bez, tak jak echo. Zwrócenie kodu 0oznacza "ten program działał pomyślnie / bez błędów" i chociaż nie wiem, co dokładnie się dzieje, gdy nie przekażesz argumentu, PHP.net mówi, że bez argumentu exitoznacza sukces, więc założyłbym się zwraca 0, chociaż znowu PHP.net nie pokazuje wartości domyślnej dla argumentu.

AgentConundrum
źródło
3
exit(0)oznacza wyjście z sukcesem, exit(1)oznacza wyjście z porażką.
Yousha Aleayoub
Do Twojej wiadomości, nigdzie nie wspomniano wyraźnie (łącznie z instrukcją PHP), jaki będzie rzeczywisty kod zakończenia podczas wywoływania exit(lub die) z parametrem ciągu. Widząc np. Pospolity die(-1)idiom, a także die("Poo!...")dużo wywołań, można nie być jednak tego pewnym, a zresztą: zgadywanie powinno należeć do innych zawodów ... A więc FTR: to 0. Co również oznacza, że ​​ten drugi die("error!")byłby najbardziej prawdopodobnie jest to błąd w skryptach CLI! : -o
Sz.
6

Jak kilka osób wspomniało, die () i exit () to dokładnie to samo.

Jeśli spojrzysz na dokumentację PHP , są dwie opcje argumentów:

  • Wartość liczbowa. Jest to przydatne tylko wtedy, gdy używasz PHP z wiersza poleceń, w przeciwieństwie do serwera WWW. Wartość zero oznacza sukces. Wartość różna od zera wskazuje, że wystąpił stan błędu.

  • Wartość ciągu. Zostanie to wyświetlone w przeglądarce, gdy nastąpi wyjście.

Zamiast die () lub exit () zalecam używanie wyjątków i niestandardowego modułu obsługi wyjątków najwyższego poziomu do zarządzania warunkami awarii.

Dzięki temu masz większą elastyczność w wykonywaniu takich czynności, jak automatyczne rejestrowanie błędów. Ponadto, jeśli używasz PHP do implementacji JSON API, ta obsługa wyjątków może zamiast tego zwrócić prawidłowy, wskazujący błąd fragment kodu JSON.

nsanders
źródło
Rozumiem warunki niepowodzenia, ale chcę odpowiednio wskazać sukces.
Tabletki wybuchowe
W przypadku normalnej interakcji opartej na przeglądarce po prostu umrzyj (). Aby użyć php w wierszu poleceń, do die (0).
nsanders,
Warto wspomnieć, że sama funkcja die () nie wskazuje na błąd. Po prostu zatrzymuje wykonywanie wszystkich skryptów php.
nsanders,
+1 wzmianka o linii poleceń, zbyt wiele osób zapomina o php linii poleceń
John Magnolia
@JohnMagnolia: Ale potem zapomniał o tym samym bezpośrednio poniżej, mówiąc "zostanie wyświetlony w przeglądarce, gdy nastąpi wyjście". ;) (Oczywiście jest to też wyświetlane w konsoli CLI.)
Sz.
5

Powiedziałbym, że jeśli chodzi o lepszą semantykę, die($arg);powinna być używana do nienormalnego lub nieoczekiwanego zakończenia, nawet jeśli - oczywiście - nadal to złapałeś. I exit($arg);powinien być używany do normalnego (oczekiwanego / kontrolowanego) końca procesu, jak w break;przypadku struktury forlub whilelub switchstruktury, ale z ostatecznym zakończeniem.

Niemniej jednak… Osobiście często używam ogólnej if { } else { }struktury do sterowania różnymi gałęziami ogromnych procesów lub buforowania wyjścia, więc nie muszę używać opcji „exit”.

Używam również die($arg)w prostej semantyce wyłapującej błędy, takiej jak w

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

jjyepez
źródło
1

die();jest tylko synonimem exit();i funkcjonalnie identyczne.

Standardowym sposobem jest użycie kodu zakończenia zerowego do oznaczenia sukcesu i czegokolwiek innego do określenia warunku błędu.

slugonamission
źródło
1

die () jest zwykle używany do zabicia skryptu z wyjściem błędu:

die("There was a fatal error");

wyjście gdzie-jako jest zwykle używane jako udane wyjście (przynajmniej w moim kodowaniu)

PHP Manual mówi, że funkcje są identyczne.

xthexder
źródło
1

Zostanę odrzucony do piekła , ale w niektórych przypadkach podczas hakowania w CLI nie chcemy, aby program został zabity, jednocześnie nie chcąc kontynuować pełnego wykonania.

W tym przypadku celem jest uniknięcie wykonywania wywołań API do oddzielnego pliku punktów ręki. Powiedzmy, że mam ładny przycisk odtwarzania w moim interfejsie, który wykonuje wywołania systemowe.

Przykład 1: Program został zabity po wykonaniu zadania, żadne dane nie zostały zwrócone. To nie jest pożądane.

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

Przykład 2: Program nadal działa , przekazując pełne dane w żądaniu GET. W tym przypadku nie jest to konieczne. To spowalnia przeglądarkę ze wszystkimi danymi, które już ma.

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

Przykład 3: Program nadal działa , żadne dane nie zostały zwrócone zgodnie z oczekiwaniami, polecenie odtwarzania zostało wykonane, ale cały zestaw danych został przeanalizowany, jest to niepotrzebne zadanie, może spowolnić działanie php / maszyny.

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

Przykład 4: Program nadal działa , żadne dane nie zostały zwrócone zgodnie z oczekiwaniami, polecenie odtwarzania zostało wykonane, całe dane nie zostały przeanalizowane, php zwrócił bardzo szybko 200 OK z pustą odpowiedzią, zgodnie z oczekiwaniami. Wszyscy szczęśliwi!

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

Tak! Używanie GOTO jest czasami brane pod uwagę - jako najlepsze do zrobienia 🔨 -!

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

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

NVRM
źródło
0

diejest dokładnie równoważne exit.

Z instrukcji :

Jeśli status jest liczbą całkowitą, ta wartość będzie używana jako status wyjścia.

Jest to przydatne tylko wtedy, gdy masz jakieś opakowanie, które robi coś na podstawie statusu wyjścia. Chyba że masz konkretną potrzebę zgłoszenia kodu wyjścia światu zewnętrznemu, po prostu exit;.

Hamish
źródło