Wie funktioniert "etwas tun ODER DIE ()" in PHP?

99

Ich schreibe eine PHP-App, um auf eine MySQL-Datenbank zuzugreifen, und in einem Tutorial steht etwas über das Formular

mysql_connect($host, $user, $pass) or die("could not connect");

Woher weiß PHP, dass die Funktion fehlgeschlagen ist, sodass der Die-Teil ausgeführt wird? Ich frage mich wohl, wie das "oder" funktioniert. Ich glaube nicht, dass ich es schon einmal gesehen habe.

Chustar
quelle
3
Verwenden Sie diese Logik im Übrigen nicht in tatsächlichen Anwendungen. Es wundert mich immer noch, wie viele Tutorials das machen.
Eran Galperin
2
Warum nicht benutzen? Es ist wirklich schön und lesbar ...
rkj
11
Dies mag für ein Tutorial einfach und angemessen sein, aber Sie möchten nicht, dass Ihr Skript mit einer solchen Fehlermeldung vor echten Benutzern unanständig stirbt. Das Anzeigen einer benutzerdefinierten Fehlerseite (ohne Angabe des tatsächlichen Fehlers!) + Protokollieren des Fehlers ist ein Muss.
Eran Galperin
4
Ich spreche vom "oder", nicht vom "sterben".
Artelius
21
mysql_connect ($ host, $ user, $ pass) oder PrintNiceError ('DatabsaeConnectionError');
Matpie

Antworten:

133

Wenn die erste Anweisung zurückgegeben wird true, muss die gesamte Anweisung sein, truedaher wird der zweite Teil niemals ausgeführt.

Beispielsweise:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

Wenn Ihre Abfrage nicht erfolgreich ist, wird die die()Anweisung ausgewertet und das Skript beendet.

nickf
quelle
1
Gute Erklärung. Dieses "implizite Wenn" -Sprachenkonstrukt von PHP ist ein wenig gefährlich, da Sie Anweisungen haben können, von denen Sie glauben, dass sie ausgeführt werden, aber wirklich nicht, und das ist nicht so offensichtlich, als ob Sie einen if-Block hätten.
Petruza
6
Dies wird als Kurzschlussauswertung bezeichnet und ist auch in anderen Sprachen als PHP nützlich.
Herr Griever
1
Übrigens können Sie nach OR nur eine einzige Anweisung verwenden. Eine Blockanweisung schlägt bei der Syntaxprüfung fehl (z. B. könnte die eigentliche Fehlermeldung Analysefehler sein: Syntaxfehler, unerwartetes '{' in ...)
Scott Chu
Und hier war ich und dachte, dies sei eine Art fortgeschrittenes Feature wie Pythons withAussage, wenn es sich eigentlich nur um einen booleschen Ausdruck handelt ... Ich denke, bei der Verwendung dieses Ausdrucks ist besondere Vorsicht geboten, wenn von Ihnen erwartet wird, dass Sie im Falle von eine Bereinigung durchführen Fehler. Bitte korrigieren Sie mich, wenn ich falsch liege, aber wenn Sie dies tun func_call($file) or die();und die Funktion fehlschlägt, bleibt die Datei offen, wenn die Skripte sterben.
Pedromanoel
@Petruza Ist es überhaupt eine gute Praxis, orin Situationen zu arbeiten, in denen ein iffunktionieren könnte?
Limeandcoconut
32

PHPs orfunktionieren wie Cs ||(das übrigens auch von PHP unterstützt wird - orsieht einfach besser aus und hat eine andere Operator-Priorität - siehe diese Seite ).

Es wird als Kurzschlussoperator bezeichnet , da alle Auswertungen übersprungen werden, sobald genügend Informationen vorliegen, um den endgültigen Wert zu bestimmen.

Wenn in Ihrem Beispiel mysql_connect()TRUE zurückgegeben wird, weiß PHP bereits, dass die gesamte Anweisung die()unabhängig von der Bewertung als TRUE ausgewertet wird und daher die()nicht ausgewertet wird.

Wenn mysql_connect()FALSE zurückgegeben wird, weiß PHP nicht, ob die gesamte Anweisung TRUE oder FALSE ergibt, und versucht, die()das Skript zu bewerten. Dabei wird das Skript beendet.

Es ist nur ein schöner Trick, der die Funktionsweise ausnutzt or.

Artelius
quelle
+1 für die Benennung von Kurzschlüssen. Könnte auch "Nebenwirkung" genannt haben. Wir sind überhaupt nicht an dem Rückkehrcode (() interessiert, wir wollen nur den Effekt seiner Ausführung. (Es wird nicht immer sterben ()). Dies ist bei Puristen nicht immer beliebt, da einige Effekte dunkel sein können.
McKenzm
und das ist noch nicht alles. Sie können auch Dinge verwenden und kombinieren, bei denen Sie möchten, dass das eine definitiv funktioniert, bevor Sie das zweite tun.
My1
11

Es funktioniert wie andere beschrieben haben.

Verwenden Sie in PHP nicht "die", da dies KEINE Ausnahme auslöst (wie in Perl). Wirf stattdessen eine Ausnahme wie gewohnt richtig aus.

Die kann nicht in PHP abgefangen werden und protokolliert nicht. Stattdessen wird die Nachricht unanständig gedruckt und das Skript sofort beendet, ohne dass jemandem etwas gesagt wird oder Sie die Möglichkeit haben, das Ereignis aufzuzeichnen, es erneut zu versuchen usw.

MarkR
quelle
-1
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
Arun Kumar
quelle