Comment fonctionne «faire quelque chose ou mourir ()» en PHP?

99

J'écris une application php pour accéder à une base de données MySQL, et sur un tutoriel, cela 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 exécuter la partie die? Je suppose que je demande comment fonctionne la partie «ou». Je ne pense pas l'avoir vu auparavant.

chustar
la source
3
En passant, n'utilisez pas ce type de logique dans les applications réelles. Je suis toujours étonné de voir combien de tutoriels font cela.
Eran Galperin
2
Pourquoi ne pas l'utiliser? C'est vraiment sympa et lisible ...
rkj
11
Cela peut être simple et approprié pour un didacticiel, mais vous ne voulez pas que votre script meure sans grâce avec un message d'erreur comme celui-ci devant de vrais utilisateurs. Afficher une page d'erreur personnalisée (sans spécifier l'erreur réelle!) + Enregistrer l'erreur est un must.
Eran Galperin
4
Je parle du "ou", pas du "die".
Artelius
21
mysql_connect ($ host, $ user, $ pass) ou PrintNiceError ('DatabsaeConnectionError');
matpie le

Réponses:

133

Si la première instruction retourne true, alors l'instruction entière doit être truedonc la seconde partie n'est 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' die()instruction et terminera le script.

nickf
la source
1
Bonne explication. Cette construction de langage "implicite si" de PHP est un peu dangereuse, parce que vous pouvez avoir des instructions que vous pensez être exécutées mais qui ne le sont pas vraiment, et ce n'est pas aussi évident que si vous aviez un bloc if.
Petruza
6
Ceci est appelé évaluation de court-circuit et est également utile dans des langages autres que PHP.
Mr Griever
1
En passant, vous ne pouvez utiliser qu'une seule instruction après OR. Une instruction de bloc échouera à la vérification de la syntaxe (par exemple, le message d'erreur réel pourrait être une erreur d'analyse: erreur de syntaxe, '{' inattendu dans ...)
Scott Chu
Et j'étais là, pensant que c'était une sorte de fonctionnalité avancée comme la withdéclaration de python , alors qu'il ne s'agit en fait que d'une expression booléenne ... Je pense que des précautions supplémentaires doivent être prises lors de l'utilisation de cette expression si vous êtes censé effectuer un nettoyage en cas de les erreurs. S'il vous plaît, corrigez-moi si je me trompe, mais si vous le faites func_call($file) or die();et que la fonction échoue, le fichier est laissé ouvert lorsque les scripts meurent.
pedromanoel
@Petruza Est-ce même une bonne pratique à utiliser ordans des situations où un ifpourrait fonctionner?
limeandcoconut
32

PHP orfonctionne comme celui de C ||(qui est d'ailleurs également pris en charge par PHP - orsemble juste plus joli et a une priorité d'opérateur différente - voir cette page ).

Il est connu comme un opérateur de court-circuit car il ignorera toutes les évaluations une fois qu'il aura 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 quelle que soit la valeur die()évaluée, et par conséquent die()n'est pas évaluée.

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

C'est juste une belle astuce qui profite de la façon dont orfonctionne.

Artelius
la source
+1 pour nommer le court-circuit. Peut-être aussi nommé «effet secondaire». Nous ne sommes pas du tout intéressés par le code retour de die (), nous voulons juste l'effet de son exécution. (Ce ne sera pas toujours die ()). Ce n'est pas toujours populaire auprès des puristes car certains effets peuvent être obscurs.
mckenzm
et ce n'est pas tout. vous pouvez également utiliser et combiner des choses, là où vous voulez qu'une chose fonctionne définitivement avant de faire une deuxième chose.
My1
11

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

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

die ne peut pas être attrapé en PHP et ne se connecte pas - au lieu de cela, il imprime le message sans grâce et quitte immédiatement le script sans rien dire à personne ni vous donner la possibilité d'enregistrer l'événement, réessayer, etc.

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