113 Stimmen

Wie funktioniert "do something OR DIE()" in PHP?

Ich schreibe eine php app auf eine MySQL-Datenbank zugreifen, und auf ein Tutorial, sagt es etwas der Form

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

Woher weiß PHP, dass die Funktion fehlgeschlagen ist, so dass es den Würfelteil ausführt? Ich schätze, ich frage, wie der "oder"-Teil der Funktion funktioniert. Ich glaube nicht, dass ich ihn schon einmal gesehen habe.

3 Stimmen

Nebenbei bemerkt: Verwenden Sie diese Art von Logik nicht in tatsächlichen Anwendungen. Es erstaunt mich immer noch, wie viele Tutorials das tun.

3 Stimmen

Warum nicht? Es ist wirklich schön und gut lesbar...

12 Stimmen

Das mag für ein Tutorial einfach und angemessen sein, aber Sie wollen nicht, dass Ihr Skript vor echten Benutzern mit einer solchen Fehlermeldung unschön endet. Die Anzeige einer benutzerdefinierten Fehlerseite (ohne Angabe des tatsächlichen Fehlers!) und die Protokollierung des Fehlers sind ein Muss.

145voto

nickf Punkte 517253

Wenn die erste Anweisung den Wert true dann muss die gesamte Anweisung true daher wird der zweite Teil nie ausgeführt.

Zum Beispiel:

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

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

Wenn Ihre Abfrage also nicht erfolgreich ist, wird das Programm die die() Anweisung und beenden Sie das Skript.

1 Stimmen

Gute Erklärung. Dieses "implizite if"-Konstrukt von PHP ist ein wenig gefährlich, weil man Anweisungen haben kann, von denen man denkt, dass sie ausgeführt werden, aber in Wirklichkeit nicht, und das ist nicht so offensichtlich, wie wenn man einen if-Block hätte.

7 Stimmen

Dies wird als Kurzschlussauswertung bezeichnet und ist auch in anderen Sprachen als PHP nützlich.

1 Stimmen

Übrigens können Sie nur eine einzige Anweisung nach OR verwenden. Eine Blockanweisung schlägt bei der Syntaxprüfung fehl (die aktuelle Fehlermeldung könnte z. B. lauten: Parse error: syntax error, unexpected '{' in ...)

39voto

Artelius Punkte 46771

PHP or funktioniert wie C's || (das übrigens auch von PHP unterstützt wird - or sieht einfach hübscher aus und hat einen anderen Vorrang für Operatoren - siehe diese Seite ).

Es ist bekannt als eine Kurzschluss Operator, weil er alle Auswertungen überspringt, sobald er genügend Informationen hat, um den endgültigen Wert zu bestimmen.

In Ihrem Beispiel, wenn mysql_connect() TRUE zurückgibt, weiß PHP bereits, dass die gesamte Anweisung zu TRUE ausgewertet wird, egal was die() wird zu ausgewertet, und daher die() nicht ausgewertet wird.

Si mysql_connect() FALSE zurückgibt, weiß PHP nicht, ob die gesamte Anweisung zu TRUE oder FALSE ausgewertet wird, also macht es weiter und versucht, die die() - Das Skript wird dabei beendet.

Das ist nur ein netter Trick, der sich die Art und Weise zunutze macht, wie or funktioniert.

0 Stimmen

+1 für die Benennung des Kurzschlusses. Man hätte auch "Nebenwirkung" sagen können. Wir sind überhaupt nicht am Rückgabewert von die() interessiert, sondern nur an den Auswirkungen der Ausführung. (Es wird nicht immer die() sein). Dies ist bei Puristen nicht immer beliebt, da einige Effekte obskur sein können.

0 Stimmen

Und das ist nicht alles. Sie können auch und verwenden, um Dinge zu kombinieren, wenn Sie wollen, dass eine Sache definitiv funktioniert, bevor Sie eine zweite Sache tun.

14voto

MarkR Punkte 60862

Es funktioniert, wie andere beschrieben haben.

In PHP sollten Sie nicht "die" verwenden, da es KEINE Ausnahme auslöst (wie in Perl). Werfen Sie stattdessen eine Exception auf die normale Art und Weise.

stirbt, kann in PHP nicht abgefangen werden und wird nicht protokolliert. Stattdessen wird die Meldung unbarmherzig ausgedruckt und das Skript sofort beendet, ohne dass irgendjemand etwas erfährt oder Sie die Möglichkeit haben, das Ereignis aufzuzeichnen, es erneut zu versuchen usw.

1voto

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X