exit, exit (), exit (0), die (), die (0) - So beenden Sie das Skript

81

Ich glaube, dass alle diese (und sogar die()oder die(0)) identisch sind. Wenn sie nicht identisch sind, welche wird zum erfolgreichen Beenden eines Skripts bevorzugt? Wenn sie identisch sind, gibt es einen bevorzugten Standard für den erfolgreichen Abschluss des Skripts? Ich neige dazu zu benutzen exit;.

EDIT: Alle Antworten haben " die()und exit()sind identisch", obwohl ich das in meiner Frage sage. Ich habe den Titel aktualisiert, um hoffentlich klarer zu machen, dass dies NICHT meine Frage ist. Ich möchte den Erfolg eines Befehlszeilenskripts klar anzeigen.

Explosionspillen
quelle
4
Ich glaube, sie sind identisch stackoverflow.com/questions/1795025/…
Doug Owings
Verwenden Sie keines davon ... verwenden Sie einfach eine Kombination aus Echo und Return.
2
@ HiroProtagonist nicht einverstanden; returnhat eine andere Implikation
Explosion Pills

Antworten:

66

Diese sind alle identisch. Ich bin mir ziemlich sicher, dass dies die()nur ein direkter Alias ​​ist exit(), aber selbst wenn dies nicht der Fall ist, verhält es sich immer noch identisch.

Wenn eine dieser Funktionen ein Zeichenfolgenargument erhält, druckt sie die Zeichenfolge aus, bevor der Prozess beendet wird. Wenn eine Ganzzahl unter 255 gefunden wird, wird diese Ganzzahl als Rückkehrcode für den Prozess betrachtet, der an den Prozess zurückgegeben wird, der das PHP-Skript aufgerufen hat. Dies ist besonders nützlich, wenn Sie Befehlszeilenanwendungen schreiben (PHP ist nicht nur im Internet verfügbar!).

Was den Unterschied zwischen exit, exit()und exit(0)gibt es wirklich keine. Es gibt definitiv keinen Unterschied zwischen den ersten beiden, da exites sich technisch gesehen um ein Sprachkonstrukt handelt, nicht um eine Funktion, so dass es genau wie mit oder ohne Klammern aufgerufen werden kann echo. Die Rückgabe eines Code of 0bedeutet "Dieses Programm wurde erfolgreich / ohne Fehler ausgeführt", und obwohl ich nicht weiß, was genau passiert, wenn Sie kein Argument übergeben, sagt PHP.net , dass ein Argument ohne exitErfolg anzeigt, also würde ich wetten es wird zurückgegeben 0, obwohl PHP.net erneut keine Standardeinstellung für das Argument anzeigt .

AgentConundrum
quelle
3
exit(0)bedeutet mit Erfolg beenden, exit(1)bedeutet mit Misserfolg beenden.
Yousha Aleayoub
Zu Ihrer Information, nirgendwo explizit erwähnt (einschließlich des PHP-Handbuchs), wie der tatsächliche Exit-Code beim Aufrufen exit(oder die) mit einem String-Parameter aussehen würde. Wenn man zB die gängige die(-1)Redewendung gesehen hat und auch die("Poo!...")viel ruft, ist man sich vielleicht doch nicht so sicher, und trotzdem: Raten sollte zu anderen Berufen gehören ... Also, FTR: es ist 0. Was auch bedeutet, dass Letzteres die("error!")am meisten wäre wahrscheinlich tatsächlich ein Fehler in CLI-Skripten! : -o
Gr.
6

Wie bereits erwähnt, sind die () und exit () genau gleich.

Wenn Sie sich die PHP-Dokumentation ansehen , gibt es zwei Möglichkeiten für Argumente:

  • Ein numerischer Wert. Dies ist nur nützlich, wenn Sie PHP über die Befehlszeile verwenden, im Gegensatz zu einem Webserver. Ein Wert von Null zeigt Erfolg an. Ein Wert ungleich Null zeigt an, dass ein Fehler aufgetreten ist.

  • Ein Zeichenfolgenwert. Dies wird dem Browser beim Beenden angezeigt.

Anstelle von die () oder exit () empfehle ich die Verwendung von Ausnahmen und eines benutzerdefinierten Ausnahmebehandlers der obersten Ebene, um die Fehlerbedingungen zu verwalten.

Auf diese Weise haben Sie mehr Flexibilität, um beispielsweise die automatische Fehlerprotokollierung durchzuführen. Wenn Sie PHP zum Implementieren einer JSON-API verwenden, kann dieser Ausnahmebehandler stattdessen ein gültiges, fehleranzeigendes JSON-Snippet zurückgeben.

nsanders
quelle
Ich verstehe die Fehlerbedingungen, möchte aber den Erfolg richtig anzeigen.
Explosion Pills
Für eine normale, browserbasierte Interaktion sterben Sie einfach (). Für die Befehlszeilenverwendung von PHP sterben Sie (0).
Nsanders
Es ist erwähnenswert ... die () allein zeigt keinen Fehlerzustand an. Es stoppt einfach die gesamte Ausführung von PHP-Skripten.
nsanders
+1 Erwähnung der Kommandozeile, zu viele Leute vergessen die Kommandozeile PHP
John Magnolia
@ JohnMagnolia: Aber dann hat er das Gleiche gleich unten vergessen, als er sagte "wird dem Browser angezeigt, wenn der Exit erfolgt". ;) (Natürlich wird es auch in einer CLI-Konsole angezeigt.)
Gr.
5

Ich würde sagen, dass in Bezug auf eine bessere Semantik die($arg);für eine abnormale oder unerwartete Beendigung verwendet werden sollte, auch wenn Sie sie natürlich noch gefangen haben. Und exit($arg);sollte für ein normales (erwartetes / kontrolliertes) Ende eines Prozesses verwendet werden, wie break;für ein foroder whileoder eine switchStruktur, aber mit einem endgültigen Ende.

Trotzdem .. Ich persönlich verwende oft eine allgemeine if { } else { }Struktur, um verschiedene Zweige großer Prozesse oder die Ausgabepufferung zu steuern, ohne "exit" verwenden zu müssen.

Ich verwende auch die($arg)in einfachen fehlerfängenden Semantiken wie in

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

jjyepez
quelle
1

die();ist nur ein Synonym für exit();und ist funktional identisch.

Die Standardmethode besteht darin, den Exit-Code Null zu verwenden, um den Erfolg anzuzeigen, und alles andere, um eine Fehlerbedingung anzuzeigen.

Slugonamission
quelle
1

die () wird normalerweise verwendet, um das Skript mit einer Fehlerausgabe zu beenden:

die("There was a fatal error");

where-as-Exit wird normalerweise als erfolgreicher Exit verwendet (zumindest in meiner Codierung)

Das PHP-Handbuch besagt, dass die Funktionen identisch sind.

xthexder
quelle
1

Ich werde zur Hölle herabgestimmt , aber in einigen Fällen wollen wir beim Hacken in CLI nicht, dass das Programm getötet wird, während wir nicht die vollständige Ausführung fortsetzen wollen.

Hier besteht das Ziel darin, API-Aufrufe einer separaten Handpunktdatei zu vermeiden. Angenommen, ich habe eine nette Wiedergabetaste in meiner Benutzeroberfläche, die Systemaufrufe ausführt.

Beispiel 1: Das Programm wird nach dem Job beendet, es werden keine Daten zurückgegeben. Das ist nicht erwünscht.

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

Beispiel 2: Das Programm wird weiterhin ausgeführt und füttert die gesamten Daten in der GET-Anforderung. Dies ist in diesem Fall nicht erforderlich. Dies verlangsamt den Browser mit allen Daten, die er bereits hat.

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

Beispiel 3: Die Programm läuft noch , es wurden keine Daten wie erwartet zurückgegeben, der Wiedergabebefehl wurde ausgeführt, aber der gesamte Datensatz wird analysiert. Dies ist ein unnötiger Job. Dies kann PHP / den Computer verlangsamen.

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

Beispiel 4: Die Programm läuft noch , es wurden keine Daten wie erwartet zurückgegeben, der Wiedergabebefehl wurde ausgeführt, die gesamten Daten wurden nicht analysiert, PHP gab wie erwartet superschnell 200OK mit einer leeren Antwort zurück. Alle glücklich!

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

Ja! Die Verwendung von GOTO ist manchmal als das Beste zu betrachten 🔨 -!

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

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

NVRM
quelle
0

dieist genau gleichbedeutend mit exit.

Aus dem Handbuch :

Wenn status eine Ganzzahl ist, wird dieser Wert als Exit-Status verwendet.

Dies ist nur nützlich, wenn Sie eine Art Wrapper haben, der etwas basierend auf dem Exit-Status ausführt. Es sei denn, Sie müssen speziell einen Exit-Code an die Außenwelt melden exit;.

Hamish
quelle