580 votes

En quoi les opérateurs de comparaison PHP égalité (== double égal) et identité (=== triple égal) diffèrent-ils ?

Quelle est la différence entre == y === ?

  • Comment exactement la vague == la comparaison fonctionne-t-elle ?
  • Comment exactement le strict === la comparaison fonctionne-t-elle ?

Quels seraient des exemples utiles ?

707voto

nickf Points 185423

Différence entre == y ===

La différence entre l'approche vaguement == et l'opérateur strict === opérateur identique est exactement expliqué dans le manuel :

Opérateurs de comparaison

 Example   Name       Result                                                    

$a ==  $b  Equal      TRUE if $a is equal to $b after type juggling.            
$a === $b  Identical  TRUE if $a is equal to $b, and they are of the same type. 

Loosely == comparaison équitable

Si vous utilisez le == ou tout autre opérateur de comparaison qui utilise la comparaison libre, tel que != , <> o == vous devez toujours regarder le contexte pour voir ce qui est converti, où et pourquoi, afin de comprendre ce qui se passe.

Règles de conversion

Tableau de comparaison des types

A titre de référence et d'exemple, vous pouvez voir le tableau de comparaison dans la page de l'UE. manuel :

Des comparaisons lâches avec ==

          TRUE   FALSE    1      0     -1     "1"    "0"   "-1"   NULL   array()  "php"   ""   

 TRUE     TRUE   FALSE  TRUE   FALSE  TRUE   TRUE   FALSE  TRUE   FALSE  FALSE    TRUE   FALSE 
 FALSE    FALSE  TRUE   FALSE  TRUE   FALSE  FALSE  TRUE   FALSE  TRUE   TRUE     FALSE  TRUE  
 1        TRUE   FALSE  TRUE   FALSE  FALSE  TRUE   FALSE  FALSE  FALSE  FALSE    FALSE  FALSE 
 0        FALSE  TRUE   FALSE  TRUE   FALSE  FALSE  TRUE   FALSE  TRUE   FALSE    TRUE   TRUE  
 -1       TRUE   FALSE  FALSE  FALSE  TRUE   FALSE  FALSE  TRUE   FALSE  FALSE    FALSE  FALSE 
 "1"      TRUE   FALSE  TRUE   FALSE  FALSE  TRUE   FALSE  FALSE  FALSE  FALSE    FALSE  FALSE 
 "0"      FALSE  TRUE   FALSE  TRUE   FALSE  FALSE  TRUE   FALSE  FALSE  FALSE    FALSE  FALSE 
 "-1"     TRUE   FALSE  FALSE  FALSE  TRUE   FALSE  FALSE  TRUE   FALSE  FALSE    FALSE  FALSE 
 NULL     FALSE  TRUE   FALSE  TRUE   FALSE  FALSE  FALSE  FALSE  TRUE   TRUE     FALSE  TRUE  
 array()  FALSE  TRUE   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  TRUE   TRUE     FALSE  FALSE 
 "php"    TRUE   FALSE  FALSE  TRUE   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE    TRUE   FALSE 
 ""       FALSE  TRUE   FALSE  TRUE   FALSE  FALSE  FALSE  FALSE  TRUE   FALSE    FALSE  TRUE  

Strict === comparaison identique

Si vous utilisez le === ou tout autre opérateur de comparaison qui utilise une comparaison stricte, tel que !== o === alors vous pouvez toujours être sûr que les types ne seront pas par magie changer, parce qu'il n'y aura pas de conversion en cours. Ainsi, dans le cas d'une comparaison stricte, le type et la valeur doivent être les mêmes, et pas seulement la valeur.

Tableau de comparaison des types

A titre de référence et d'exemple, vous pouvez voir le tableau de comparaison dans la page de l'UE. manuel :

Des comparaisons strictes avec ===

          TRUE   FALSE    1      0     -1     "1"    "0"   "-1"   NULL   array()  "php"   ""   

 TRUE     TRUE   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE    FALSE  FALSE 
 FALSE    FALSE  TRUE   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE    FALSE  FALSE 
 1        FALSE  FALSE  TRUE   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE    FALSE  FALSE 
 0        FALSE  FALSE  FALSE  TRUE   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE    FALSE  FALSE 
 -1       FALSE  FALSE  FALSE  FALSE  TRUE   FALSE  FALSE  FALSE  FALSE  FALSE    FALSE  FALSE 
 "1"      FALSE  FALSE  FALSE  FALSE  FALSE  TRUE   FALSE  FALSE  FALSE  FALSE    FALSE  FALSE 
 "0"      FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  TRUE   FALSE  FALSE  FALSE    FALSE  FALSE 
 "-1"     FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  TRUE   FALSE  FALSE    FALSE  FALSE 
 NULL     FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  TRUE   FALSE    FALSE  FALSE 
 array()  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  TRUE     FALSE  FALSE 
 "php"    FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE    TRUE   FALSE 
 ""       FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE    FALSE  TRUE  

73 votes

Quelqu'un d'autre trouve-t-il étrange que "000" == "0000" ?

2 votes

Peut-être que les chaînes qui ressemblent à des nombres sont converties en nombres avant la comparaison, si c'est vrai, alors 000 == 0000 a du sens.

39 votes

Ce qui me surprend toujours, c'est que false == array(), et false == 0 mais array() != 0, donc false == array() !=/== 0 ? ça me semble bizarre.

31voto

En ce qui concerne le JavaScript :

L'opérateur === fonctionne de la même manière que l'opérateur ==, mais il exige que ses opérandes aient non seulement la même valeur, mais aussi le même type de données.

Par exemple, l'exemple ci-dessous affichera "x et y sont égaux", mais pas "x et y sont identiques".

var x = 4;
var y = '4';
if (x == y) {
    alert('x and y are equal');
}
if (x === y) {
    alert('x and y are identical');
}

8voto

Tout est question de types de données. Prenez un BOOL (vrai ou faux) par exemple :

true est également égal à 1 et false est également égal à 0

le site == ne se soucie pas des types de données lors de la comparaison : donc si vous avez une var qui vaut 1 (qui pourrait aussi être true ):

$var=1;

et ensuite comparer avec le == :

if ( $var == true )
{
echo"var is true";
}

Mais $var n'est pas réellement égal à true n'est-ce pas ? Il a la valeur int de 1 à la place, qui à son tour, est égal à true.

Con === les types de données sont vérifiés pour s'assurer que les deux variables/objets/autres utilisent le même type.

Donc si je l'ai fait :

if ( $var === true )
{
echo"var is true";
}

Cette condition ne serait pas vraie, car $var!==true c'est seulement == true (si vous voyez ce que je veux dire).

Pourquoi en auriez-vous besoin ?

Simple - Jetons un coup d'œil à l'une des fonctions de PHP : array_search() :

le site array_search() recherche simplement une valeur dans un tableau, et renvoie la clé de l'élément dans lequel la valeur a été trouvée. Si la valeur n'a pas été trouvée dans le tableau, elle renvoie la clé de l'élément dans lequel la valeur a été trouvée. faux . Mais, et si vous faisiez un array_search() sur une valeur qui a été stockée dans le premier élément du tableau (qui aurait la clé de tableau de 0 )....the array_search() La fonction renverrait 0... ce qui est égal à faux...

Donc si vous l'avez fait :

$arr=array("name");
if (array_search("name",$arr)==false)
{
//this would return 0 (the key of the element the val was found in) but because we're using ==, we'll think the function actually returned false...when it didn't.
}

Donc, vous voyez comment cela pourrait être un problème maintenant ?

La plupart des gens n'utilisent pas == false lorsqu'on vérifie si une fonction renvoie faux. Au lieu de cela, ils utilisent la fonction ! . Mais en fait, c'est exactement la même chose que d'utiliser ==false donc si vous l'avez fait :

$arr=array("name");
if (!array_search("name",$arr))//this is the same as doing (array_search("name",$arr)==false)

Donc, pour ce genre de choses, vous utiliseriez la fonction === à la place, afin que le type de données soit vérifié.

6voto

Mannusanghi Points 109

Étant donné que x = 5

1) Opérateur : == est "égal à". x == 8 est faux
2) Opérateur : === est "exactement égal à" (valeur et type) x === 5 est vrai, x === "5" est faux

2voto

Stacey Richards Points 2635

Vous utiliserez === pour tester si une fonction ou une variable est fausse plutôt que de simplement l'assimiler à false (zéro ou une chaîne vide).

$needle = 'a';
$haystack = 'abc';
$pos = strpos($haystack, $needle);
if ($pos === false) {
    echo $needle . ' was not found in ' . $haystack;
} else {
    echo $needle . ' was found in ' . $haystack . ' at location ' . $pos;
}

Dans ce cas, strpos renverrait 0, ce qui équivaudrait à false dans le test.

if ($pos == false)

o

if (!$pos)

ce qui n'est pas ce que vous voulez ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X