Op�rateurs de comparaison
Les op�rateurs de comparaison, comme leur nom l'indique, vous permettent de comparer deux valeurs. Vous devriez �galement �tre int�ress�s par les tables de comparaisons de types, car ils montrent des exemples de beaucoup de types de comparaisons.
Exemple | Nom | R�sultat |
---|---|---|
$a == $b | Egal | TRUE si $a est �gal � $b. |
$a === $b | Identique | TRUE si $a est �gal � $b et qu'ils sont de m�me type (introduit en PHP 4). |
$a != $b | Diff�rent | TRUE si $a est diff�rent de $b. |
$a <> $b | Diff�rent | TRUE si $a est diff�rent de $b. |
$a !== $b | Diff�rent | TRUE si $a est diff�rent de $b ou bien qu'ils ne sont pas du m�me type. (introduit en PHP 4) |
$a < $b | Plus petit que | TRUE si $a est strictement plus petit que $b. |
$a > $b | Plus grand | TRUE si $a est strictement plus grand que $b. |
$a <= $b | Inf�rieur ou �gal | TRUE si $a est plus petit ou �gal � $b. |
$a >= $b | Sup�rieur ou �gal | TRUE si $a est plus grand ou �gal � $b. |
Si vous comparez un entier avec une cha�ne, la cha�ne est convertie en un nombre. Si vous comparez deux cha�nes num�riques, elles seront compar�es en tant qu'entiers. Ces r�gles s'appliquent aussi � l'instruction switch.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("1" == "1e0"); // 1 == 1 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // jamais �valu� parce que "a" est d�j� trouv� avec 0
echo "a";
break;
}
?>
Pour les diff�rents types, la comparaison est faite en suivant la table suivante (dans l'ordre).
Type de l'op�rande 1 | Type de l'op�rande 2 | R�sultat |
---|---|---|
null ou cha�ne de caract�res | string | Convertit NULL en "", comparaison num�rique ou lexicale |
bool�en ou null | N'importe quoi | Convertit en bool�en, FALSE < TRUE |
objet | objet | Les classes internes peuvent d�finir leur propre m�thode de comparaison; diff�rentes classes ne sont pas comparables; entre objets de m�me classe, la comparaison se fait de la m�me fa�on que pour les tableaux (PHP 4), PHP 5 a son propre comportement |
cha�ne de caract�res, ressource ou nombre | cha�ne de caract�res, ressource ou nombre | Transforme les cha�nes de caract�res et les ressources en nombres |
tableaux | tableaux | Le tableau avec le moins de membres est plus petit, si la cl� de l'op�rande 1 n'est pas trouv�e dans l'op�rande 2, alors les tableaux ne sont pas comparables, sinon la comparaison se fait valeur par valeur (voir l'exemple suivant) |
tableau | N'importe quoi | Le tableau est toujours plus grand |
objet | N'importe quoi | L'objet est toujours plus grand |
Exemple #1 Transcription des comparaisons standards des tableaux
<?php
// Les tableaux sont compar�s comme ceci avec les op�rateurs standards de comparaison
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // incomparable
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Voir aussi strcasecmp(), strcmp() les op�rateurs de tableaux, et le chapitre sur les types.
L'op�rateur ternaire
Un autre op�rateur conditionnel est l'op�rateur ternaire (":?").
Exemple #2 Assignation d'une valeur par d�faut
<?php
// Exemple d'utilisation pour l'op�rateur ternaire
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// La ligne ci-dessus est identique � la condition suivante :
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
L'expression (expr1) ? (expr2) : (expr3) est �valu�e � expr2 si expr1 est �valu�e � TRUE, et expr3 si expr1 est �valu�e � FALSE.
Depuis PHP 5.3, il est possible d'omettre la partie centrale de l'op�rateur ternaire. L'expression expr1 ?: expr3 retourne expr1 si expr1 vaut TRUE, est expr3 sinon.
Note: Notez que l'op�rateur ternaire est une instruction, et il n'est pas �valu� en tant que variable, mais en tant que r�sultat de l'instruction. Il est important de savoir si vous voulez retourner une variable par r�f�rence. L'instruction return $var == 42 ? $a : $b; dans une fonction retourn�e par r�f�rence ne fonctionnera donc pas et une alerte est �mise dans les versions sup�rieures de PHP.
Note: Il est recommand� de ne pas "empiler" les expressions ternaires. Le comportement de PHP lors de l'utilisation de plus d'un op�rateur ternaire dans une seule instruction n'est pas �vident :
Exemple #3 Comportement de PHP
<?php
// A premi�re vue, ce qui suit devrait retourner 'true'
echo (true?'true':false?'t':'f');
// cependant, l'expression ci-dessus retournera 't'
// car l'expression ternaire est �valu�e de gauche � droite
// l'expression suivante est une version plus �vidente du m�me code
echo ((true ? 'true' : 'false') ? 't' : 'f');
// ici, vous pouvez voir que la premi�re expression est �valu�e � 'true',
// ce qui fait qu'elle est �valu�e � (bool)true, ce qui retourne la branche
// 'vraie' de la seconde expression ternaire.
?>