web-dev-qa-db-fra.com

Comment "faire quelque chose OR DIE ()") fonctionne-t-il en PHP?

J'écris une application php pour accéder à une base de données MySQL, et sur un tutoriel, il dit quelque chose de la forme

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

Comment PHP sait-il que la fonction a échoué pour pouvoir exécuter la partie matrice? Je suppose que je demande comment fonctionne la "ou" partie de celle-ci. Je ne pense pas avoir déjà vu il avant.

96
chustar

Si la première instruction retourne true, alors l'instruction entière doit être true et la seconde partie n'est donc jamais exécutée.

Par exemple:

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

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

Par conséquent, si votre requête échoue, elle évaluera l'instruction die() et terminera le script.

130
nickf

PHP or fonctionne comme C || (qui est d'ailleurs également supporté par PHP - _ or est plus joli et a un aspect différent priorité des opérateurs - voir cette page ).

C'est ce qu'on appelle un opérateur court-circuit car il ignorera toutes les évaluations lorsqu'il disposera de suffisamment d'informations pour décider de la valeur finale.

Dans votre exemple, si mysql_connect() renvoie VRAI, alors PHP sait déjà que l'instruction entière sera évaluée à VRAI quel que soit le type d'évaluation de die(), et donc die() n'est pas évalué.

Si mysql_connect() retourne FALSE, PHP ne sait pas si l'instruction entière sera évaluée à VRAI ou à FAUX, donc cela continue et tente d'évaluer die() - fin le script dans le processus.

C'est juste un bon tour qui tire parti du fonctionnement de or.

32
Artelius

Cela fonctionne comme d'autres l'ont décrit.

En PHP, n'utilisez pas "die", car il ne lève PAS d'exception (comme en Perl). Au lieu de cela, lancez une exception correctement de la manière habituelle.

die ne peut pas être attrapé par PHP, et ne se connecte pas - il imprime plutôt le message et quitte immédiatement le script sans rien dire à personne ni vous donner la possibilité d'enregistrer l'événement, de réessayer, etc.

11
MarkR