Si vous avez suivi le tutoriel de M@teo21, vous devriez connaître ces opérateurs de comparaison :
- == (égal) ;
- != (différent de) ;
- < (plus petit que) ;
- > (plus grand que) ;
- <= (inférieur ou égal à) ;
- >= (supérieur ou égal à).
Dans cette partie, je vais vous faire découvrir ceux-là :
- === (strictement égal, ou identique) ;
- !== (strictement différent).
Ces deux symboles vérifient les valeurs qu'on leur demande de comparer, mais aussi leur type.
L'opérateur égal (
==) compare les deux valeurs qu'on lui demande sans se soucier de leur type. Si vous décidez de comparer une chaîne de caractères et un entier, alors la chaîne de caractères sera convertie en entier.
Exemple :
Code : PHP | <?php
if ('0' == 0)
echo 'Vrai';
else
echo 'Faux';
?>
|
Ce code affichera « Vrai ».
Avec l'opérateur égal (==), toute chaîne de caractères vaut
true
, ainsi que tous les nombres décimaux — sauf 0 qui vaut
false
(0 en tant que nombre entier mais aussi en tant que chaîne de caractères).
Ainsi, ce code affichera « Vrai » :
Code : PHP | <?php
if (0 == false)
echo 'Vrai';
else
echo 'Faux';
?>
|
Et celui-là aussi :
Code : PHP | <?php
if ('voici une chaine de caractères' == true)
echo 'Vrai';
else
echo 'Faux';
?>
|
Les pièges de la conversion
Vous venez de voir qu'en PHP, 1 ==
true et 0 ==
false. Vous venez aussi de voir que lorsqu'on compare une chaîne de caractères à un nombre, celle-ci est convertie en entier. Ainsi, si je compare 'azerty' à 0, la condition renverra
true. Mais si je compare 'azerty' à
true, la condition renverra aussi
true car quand on compare une chaîne de caractères à un booléen, celle-ci n'est pas convertie en entier !
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | <?php
$chaine = 'azerty';
if ($chaine == 0) // Affiche « Vrai » car 'azerty' en entier donne 0.
echo 'Vrai';
else
echo 'Faux';
if ($chaine == false) // Affiche « Faux » car toute chaine de caractères vaut true.
echo 'Vrai';
else
echo 'Faux';
if ($chaine == 1) // Affiche « Faux » car 'azerty' en entier donne 0.
echo 'Vrai';
else
echo 'Faux';
if ($chaine == true) // Affiche « Vrai » car toute chaine de caractères vaut true.
echo 'Vrai';
else
echo 'Faux';
?>
|
Quand on convertit une chaîne de caractères en entier, et que cette chaîne commence par un nombre, la nouvelle valeur de la chaîne sera ce nombre sous forme d'entier.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | <?php
$chaine = '1azerty'; // Notez bien le 1 en début de chaîne.
if ($chaine == 0) // Affiche « Faux » car '1azerty' en entier donne 1.
echo 'Vrai';
else
echo 'Faux';
if ($chaine == false) // Affiche « Faux » car toute chaîne de caractères vaut true.
echo 'Vrai';
else
echo 'Faux';
if ($chaine == 1) // Affiche « Vrai » car '1azerty' en entier donne 1.
echo 'Vrai';
else
echo 'Faux';
if ($chaine == true) // Affiche « Vrai » car toute chaîne de caractères vaut true.
echo 'Vrai';
else
echo 'Faux';
?>
|
Piège : les différentes notations
Voici un piège très vicieux. Il existe, dans le monde de l'informatique, différentes notations : la notation décimale (10 symboles, de 0 à 9, celle que nous utilisons tout le temps), la notation hexadécimale (16 symboles, de 0 à 9 et de A à F), la notation octale (8 symboles, de 0 à 7)... Il y a d'autres notations (comme le binaire par exemple), mais je n'en parlerai pas.
Pour dire d'un nombre qu'il est décimal, on déclare la variable normalement. Pour dire que le nombre est hexadécimal, on précède le nombre d'un 0 et d'un x. Pour dire que le nombre utilise la notation octale, on précède le nombre d'un 0. Exemple :
Code : PHP | <?php
$nombreDecimal = 159; // Nombre décimal.
$nombreHexadecimal = 0xAE46AF; // Nombre hexadécimal.
$nombreOctal = 0257; // Nombre octal.
?>
|
Euh super, et où veux-tu en venir ?
Ce que je veux vous dire, c'est que le nombre 54 en base 10 (nombre décimal à 10 symboles) n'a pas la même valeur que le nombre 54 en base 8 (nombre octal à 8 symboles). Je vous conseille vivement
ce tutoriel si vous voulez en savoir plus sur les différentes notations.
Et un exemple qui illustre les différents effets qui peuvent surprendre :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | <?php
if (54 == 054) // Affiche « Faux ».
echo 'Vrai';
else
echo 'Faux';
if (54 == 0x54) // Affiche « Faux ».
echo 'Vrai';
else
echo 'Faux';
if (303 == 0457) // Affiche « Vrai » car 303 (nombre décimal) donne 457 (nombre octal) !
echo 'Vrai';
else
echo 'Faux';
if (2786 == 0xAE2) // Affiche « Vrai » car 2786 (notation décimale) donne AE2 en hexadécimal !
echo 'Vrai';
else
echo 'Faux';
?>
|
Les opérateurs stricts
Intéressons-nous maintenant aux opérateurs dits stricts car ils vérifient les deux valeurs mais aussi leur type.
Ainsi, deux valeurs de types différents ne seront jamais strictement identiques.
Exemple :
Code : PHP | <?php
if (0 === false)
echo 'Vrai';
else
echo 'Faux';
?>
|
Ce code affichera donc Faux car 0 est un entier et
false est un booléen.
Exemple concret : utilisation de la fonction strpos()
Cette fonction retourne la position numérique de la première occurrence de la chaîne recherchée dans la chaîne de caractères donnée. Si la chaîne n'est pas trouvée, la fonction renvoie
false
.
Par exemple :
Code : PHP | <?php
$chaine = 'Voici une chaîne de caractères.';
$position = strpos ($chaine, 'cha');
echo $position; // Affichera 10.
?>
|
Maintenant, imaginons que je voulais rechercher la chaîne 'Vo'.
strpos()
m'aurait retourné 0 en tant qu'entier. Si je veux comparer cette valeur, il faut utiliser l'opérateur strictement égal, ou identique. Sinon, si la chaîne n'est pas trouvée, ma condition peut renvoyer
true
, ce qui n'est pas l'effet désiré.
Exemple :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13 | <?php
$chaine = 'Voici une chaîne de caractères.';
if (strpos ($chaine, 'Vo') == 0) // Renvoie true.
echo 'Vrai';
else
echo 'Faux';
if (strpos ($chaine, 'azerty') == 0) // Renvoie true, car 0 == false !
echo 'Vrai';
else
echo 'Faux';
?>
|
Le code, comme vous pouvez le constater, ne fonctionne pas correctement. Le code fonctionnel serait le suivant :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13 | <?php
$chaine = 'Voici une chaîne de caractères.';
if (strpos ($chaine, 'Vo') === 0) // Renvoie true.
echo 'Vrai';
else
echo 'Faux';
if (strpos ($chaine, 'azerty') === 0) // Renvoie false.
echo 'Vrai';
else
echo 'Faux';
?>
|
Et voilà le travail.
Je ne vais pas m'étendre sur l'opérateur strictement différent (
!==) car son fonctionnement est le même que l'opérateur identique (
===).
Une condition avec cet opérateur renvoie
true
si l'une des deux valeurs n'est pas la même ou si les deux valeurs ne sont pas du même type.
Exemple :
Code : PHP | <?php
if ('0' !== 0) // Renvoie true car l'une des valeurs est de type string et l'autre est de type int.
echo 'Vrai';
else
echo 'Faux';
?>
|