11
votes

L'importance d'utiliser === au lieu de == dans PHP!

Aujourd'hui seulement j'ai remarqué et j'ai découvert l'importance d'utiliser === Strong> Opérateur. Vous pouvez le voir dans l'exemple suivant:

$var=0;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=false;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=0;
if ($var===false) echo "true"; else echo "false";  //prints false
$var=false;
if ($var===false) echo "true"; else echo "false";  //prints true 


6 commentaires

Vous pouvez simplement dire echo $ var == faux; etc.


Voir Stackoverflow.com/questions/1117967/What-Does-Mean


@Chris. J'ai déjà examiné cette question. Mais ma question concerne des exemples, où il est vraiment important d'envisager d'utiliser l'opérateur "===", pas "==" Opérateur.


@Skilldrick: Non, vous ne pouvez pas. PHP ne convertit pas automatiquement les valeurs booléennes en "True" / "False" Strings. Votre exemple produirait soit 1 (pour true ) ou la chaîne vide (pour false ). Les exemples pourraient être raccourcis, cependant, en utilisant l'opérateur ternaire, comme: Imprimer ($ var == faux)? 'vrai': 'faux'; .


@Jakob: assez juste! Bon point.


Un de mes pépins d'animaux en PHP, au fait. Il rend un débogage rapide et sale tellement moins rapide et bien plus sale, quand tout ce que vous voulez, c'est pour impression true pour réellement impression true.


9 Réponses :


3
votes

Le === code> est Strict em> fort> comparaison de type opérateur, il ne vérifiera pas uniquement les valeurs fortes> mais aussi leur type strong> here == code> seulement vérifie si les valeurs fortes> sont identiques.

Considérez une situation lorsque vous comparez numéros ou chaînes EM>: p>

if (4 === "4") // same value but different type
{
  // false
}


4 commentaires

Ouais, je savais ça. Mais je veux trouver des exemples où il est important d'utiliser un opérateur au lieu d'un autre.


Regardez la réponse de Felix Kling par exemple. Il a compris ce que je veux.


@Bakhtiyor: Comme vous pouvez le constater dans mon exemple, c'est aussi utile lorsque vous comparez des chiffres et des chaînes :)


Maintenant, je peux voir, mais quand vous commentant à vous répondre, il n'y avait pas d'exemples. Thx beaucoup par exemple.



13
votes

Bien sûr, juste un exemple: array_search ()

AVERTISSEMENT

Cette fonction peut retourner booléen false , mais peut également renvoyer une valeur non booléenne qui évalue à false , telle que 0 ou < code> "" . Veuillez lire la section sur Booleans pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour de cette fonction.

Fondamentalement si vous utilisez une fonction que renvoie une valeur sur le succès, mais false sur une panne , vous devez vérifier le résultat avec === être sûr (sinon, pourquoi il y aurait une grosse boîte d'avertissement rouge?;))

Exemples supplémentaires: suivant () , actuel ()
ou comme mentionné également les fonctions de chaîne comme Stros () , stripos () , etc. .

même substr () bien que Il n'est pas mentionné explicitement:

retourne la partie extraite de la chaîne ou false sur l'échec.

Mais si la partie extraite est "0" ? Il évalue également à faux , mais ce n'est pas une erreur.


2 commentaires

Suivant et actuel ne sont pas de bons exemples. Et s'il y a false valeurs comme dans array (faux) ?


@Gumbo: C'est vrai. Je viens de les mentionner parce qu'ils ont également cette boîte d'avertissement dans leur documentation. Mais il y a une note (qui devrait être plus accentuée à l'OMHO): Remarque: vous ne pourrez pas distinguer la fin d'un tableau d'un faux élément booléen. Pour parcourir correctement un tableau pouvant contenir de faux éléments, voir la fonction chacune ().



2
votes

Le === Opérateur vérifie le type ainsi que l'égalité de la valeur.

C'est pourquoi 0 === false ne retourne pas vrai, car ils ne sont pas du même type.


0 commentaires

6
votes

in Stros () Vous avez 0 lorsque la chaîne est trouvée et faux quand est mal saisissant. Vous devez utiliser === pour vérifier la différence.


0 commentaires

0
votes

J'ai récemment couru dans ce problème moi-même quand j'écrivais un analyseur de requête SQL rapide. Pour couper l'histoire courte, je comparais des paramètres cités avec leurs espaces réservés d'angle. Fondamentalement, le code suivant m'a conduit à certains temps de débogage dur (l'exemple est simplifié de manière simplifiée) xxx

$ somécontion finalement étant vrai tout le temps. frisson

Fondamentalement tout autre (==) == entraînera la distribution de la chaîne à un entier. Selon l'entrée, cela pourrait se retrouver comme 0 ou la valeur INT de la chaîne, s'il en a une, même si la chaîne entière n'est pas complètement numérique.


0 commentaires

1
votes

Strows ($ aiguille, $ bitasetack) et les fonctions associées retourneront false si $ aiguille n'existe pas en $ haunstack, et 0 si $ aiguille est le premier caractère de $ Haystack; Et il y a toute une foule de fonctions similaires. En utilisant == peut vous donner des résultats incorrects dans ce cas, vous devez donc toujours utiliser ===. Le manuel identifie clairement où cela est nécessaire.


0 commentaires

7
votes

TOUJOURS choisir === code> sur == code> sauf que vous êtes absolument sûr de besoin == code>, car == n'est pas transitif. Et cela est important pour votre raisonnement sur votre code.

Considérez l'extrait de code suivant P>

$a = "0";
$b = 0;
$c = null;


0 commentaires

3
votes

Un bon exemple où vous pouvez avoir des problèmes, c'est comparer 0 et une chaîne, fx xxx

une chaîne ne commence pas par un numéro devient 0 lorsqu'il est converti en un int. Cela peut devenir un problème lors de la comparaison d'un statut pouvant être 0 à une chaîne.


0 commentaires

0
votes

Si vous comparez deux chaînes numériques, elles sont comparées comme des entiers. 1

$a = 0;
$b = 'x';
var_dump(FALSE == $a); // TRUE
var_dump($a == $b);  // TRUE
var_dump($b == TRUE);  // TRUE
var_dump(FALSE === $a); // FALSE
var_dump($a === $b);  // FALSE
var_dump($b === TRUE);  // FALSE


0 commentaires