Maison >développement back-end >tutoriel php >Pourquoi la comparaison lâche de types PHP conduit-elle à des résultats inattendus lors de la comparaison de chaînes et d'entiers ?

Pourquoi la comparaison lâche de types PHP conduit-elle à des résultats inattendus lors de la comparaison de chaînes et d'entiers ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-07 13:35:13705parcourir

Why Does PHP's Loose Type Comparison Lead to Unexpected Results When Comparing Strings and Integers?

Anomalie de comparaison d'une chaîne à un entier

Lorsque vous comparez une chaîne à un entier en PHP, vous pouvez rencontrer des résultats inattendus. Considérez le code suivant :

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";

if ($test1 == 0)
  echo "Test 1 is Equal!?";
if ($test2 == 0)
  echo "Test 2 is Equal!?";

// Returns: Test 1 is Equal!?

Étonnamment, la comparaison $test1 est évaluée comme vraie, malgré sa valeur non numérique. Cette anomalie provient des règles de conversion de type lâches de PHP.

Conversion de chaîne en nombres

Selon le manuel PHP :

"Quand une chaîne est évaluée dans un contexte numérique, la valeur et le type résultants sont déterminés comme suit :

  • Si la chaîne contient l'un des caractères '.', 'e' ou 'E', il sera évalué comme un flottant.
  • Sinon, il sera évalué comme un entier.

La valeur est donnée par la partie initiale de la chaîne. Si la chaîne commence par des données numériques valides, ce sera la valeur utilisée. Sinon, la valeur sera 0. (zéro)."

Expliquer l'anomalie

Dans l'exemple fourni, $test1 ne contient aucun point décimal, exposant ou zéro non significatif. Par conséquent, il est interprété comme un entier avec une valeur initiale de 0. Puisque 0 est égal à l'entier 0 en PHP, la comparaison est évaluée comme vraie.

Pourquoi $test2 échoue

La chaîne $test2 contient également des caractères non numériques. Cependant, comme il commence par un chiffre, sa valeur initiale est interprétée comme un entier de 3581169. Cet entier n'est pas égal à 0, ce qui entraîne une fausse comparaison.

Éviter les anomalies de type

Pour éviter ces anomalies, utilisez toujours des comparaisons de types strictes. Dans l'exemple fourni, vous pouvez réécrire le code comme suit :

if ($test1 === "0")
  echo "Test 1 is Equal!";
if ($test2 === "0")
  echo "Test 2 is Equal!?";

En utilisant l'opérateur de comparaison stricte ===, vous vous assurez que les valeurs sont du même type et évitez des résultats inattendus.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn