Nota Bene : opérateurs et types de comparaison en PHP
Soumis par euphrate_ylb le ven, 03/14/2008 - 21:32.
Tagged: développement
• php
Etes-vous incollable sur la comparaison en PHP? Pour le savoir, jetez un rapide coup d'oeil à cette adresse :
http://fr2.php.net/manual/en/types.comparisons.php
Personnellement, cette page m'a permis d'arrêter d'écrire certaines abérations. Un tout petit exemple:
if($bool==false) {
// Attention, ce test est complètement inutile : il laisse passer false, 0, array(), null, "0"
echo 'pas bien';
}
// Attention, ce test est complètement inutile : il laisse passer false, 0, array(), null, "0"
echo 'pas bien';
}
Articles similaires
- Commentez vos fichiers source automatiquement grâce aux keywords Subversion
- CakePHP : sauts de ligne et maux de tête
- Projets en cours, le point.
- Version 0.3.2 de Fredistrano disponible
- CakePHP 1.2 beta disponible
- Version 0.3 de Fredistrano disponible
- Comment choisir son langage/framework de développement web?
- Fredistrano - Déployez vos applications PHP en quelques clics
- Activer la coloration syntaxique pour les fichiers .thtml de CakePHP dans Eclipse
- CakePHP : validation Ajax


Autre solution
Dans cette exemple est-ce que
if (!$bool){
}
pose le même soucis??
Pour tout ce qui est gestion de la "nullité" il peut être très intéressant (et en ce qui me concerne aussi plus rassurant) de développer une petite fonction ou une méthode statique (verifierNonNull($chaine))pour faire ce test avec null, "null", "0", "0000-00-00 00:00:00", etc.
En tout cas c'est la solution qui a été mise en place au boulot, ça évite de se soucier du format a tester et donc évite de possibles erreurs, d'autant plus avec un PHP qui est très laxiste sur le contenu d'une variable.
Le "=== false" permet de
Le "=== false"
permet de vérifier qu'il est non seulement égal à false, mais aussi du même type.
Mais ... ce n'est nécessaire de faire cette double vérification que si la variable peut contenir un autre type.
Donc si c'est juste pour vérifier une variable que tu définis avant par true ou false, il est plus optimisé de faire "==false" (car on connait le type).
Si au contraire, la variable peut contenir du texte par exemple, à ce moment là, oui, il est préférable de mettre "===false"
Autant expliqué à fond :)
Complément d'informations
Les variables n'étant pas typées en PHP, je préfère être aussi strict que possible afin de ne pas me retrouver avec de mauvaises surprises. D'autant plus que dans de nombreux développements, cakephp le premier, les fonctions renvoient false pour signifier un mauvais fonctionnement ou alors la valeur si tout s'est bien passé. Or il arrive souvent que le résultat soit un tableau vide ou une chaine vide ou la valeur null... Et la c'est le drame.
Dans le cas ou on est sur du type implicite de la variable, autant écrire !$bool à la place de $bool == false. Ca prend moins de place et c'est tout aussi permissif!
Quant à l'optimisation, si l'application pose des problèmes de performances, j'ai souvent pas mal de choses à améliorer (SQL, parcours de tableau) avant d'en arriver aux comparaisons. Enfin, j'ai quand même jeté un coup d'oeil en faisant un bench sur 10 millions de comparaisons:
1. $bool == false
2. $bool === false
3. !$bool
Et le résultat des courses en secondes:
1. 1.55277013779
2. 1.30964398384
3. 1.31114983559
Une courte victoire (à ma plus grande surprise) du '===' !!! Bref, même si mon test est un peu simple mais il montre que le choix de l'opérateur de comparaison ne doit pas être fait en pensant aux performances.
Ah, bah comme quoi, on peut
Ah, bah comme quoi, on peut se tromper.
Visuellement, je préfère "===" que "!" qui peut passer à la trappe après plusieurs heures de programmation. Mais j'utiliserai donc désormais "===".
Après, je parlais de performance puisque je développe mon FW, et donc, tant qu'à le faire une fois, autant bien le faire dans les détails. Pour une application, ça serait vraiment négligeable.
Framework ?
Tu développes un Framework ?
Il en existe pas mal en PHP, pourquoi ne pas en utiliser un tout fait ?
Oui, un framework. Je sais
Oui, un framework.
Je sais qu'il en existe beaucoup, mais comme pas mal de développeur, je ne suis pas très satisfait de ce qui se fait, et donc je préfère le faire maison. Je suis loin d'être le seul à être dans ce cas d'insatisfaction.
Celui qui me semblait le mieux était celui de Zend, mais je le trouve vraiment lourd pour certains petits sites. J'ai des clients qui demande des sites qui mettent 2 semaines à faire, je me vois mal leur installer un FW aussi lourd que Zend.
Après, l'appel systématique à une classe extérieur (et donc un include/require) pour le moindre petit élément me semble un peu abusé.
J'ai regardé une classe de base du Zend, il charge une class (library) uniquement pour vérifier, justement, que l'élément soit non nul. C'est un exemple, mais il y en a pas mal d'autres.
Alors, c'est peut-être pas aussi complet (forcement), mais pour avoir déjà fait 3 sites avec l'ancienne version de mon FW, je vais vraiment plus vite, et il ne met que 17ms à charger une page lambda (sans cache et avec 3 requêtes, sur une base quasi vide). Il a encaissé sans aucune difficulté 25 000 vu sur une journée et la nouvelle version que je finis actuellement est encore beaucoup plus travaillé. J'ai perdu 3 mois de dev très intensif, mais je le regrette vraiment pas.