31 votes

Pourquoi (0 == 'Hello') retourne-t-il vrai en PHP ?

Hé, si vous avez le code suivant et que vous voulez vérifier si $key correspond à Hello J'ai découvert, que la comparaison retourne toujours true si la variable est 0 . J'ai rencontré ce problème lors de l'utilisation d'un tableau pour une clé spéciale et je me suis demandé pourquoi cela ne fonctionnait pas comme prévu. Voir ce code pour un exemple.

$key = 1;
if ($key != 'Hello') echo 'Hello'; //echoes hello

$key = 2;
if ($key != 'Hello') echo 'Hello'; //echoes hello

$key = 0;
if ($key != 'Hello') echo '0Hello'; //doesnt echo hello. why?
if ($key !== 'Hello') echo 'Hello'; //echoes hello

Quelqu'un peut-il expliquer cela ?

47voto

ZoolWay Points 1354

Les opérateurs == y != ne pas comparer le type. Par conséquent, PHP convertit automatiquement 'Hello' en un entier qui est 0 ( intval('Hello') ). En cas de doute sur le type, utilisez les opérateurs de comparaison de types === y !== . Ou mieux, soyez sûr du type que vous manipulez à tout moment dans votre programme.

3voto

martinstoeckli Points 6953

D'autres ont déjà bien répondu à la question. Je veux seulement donner d'autres exemples, dont vous devez être conscient, tous sont causés par la jonglerie de type de PHP. Toutes les comparaisons suivantes retourneront vrai :

  • abc' == 0
  • 0 == null
  • '' == null
  • 1 == "1y?z

Comme je trouvais ce comportement dangereux, j'ai écrit ma propre méthode equal et je l'utilise dans mes projets :

/**
 * Checks if two values are equal. In contrast to the == operator,
 * the values are considered different, if:
 * - one value is null and the other not, or
 * - one value is an empty string and the other not
 * This helps avoid strange behavier with PHP's type juggling,
 * all these expressions would return true:
 * 'abc' == 0; 0 == null; '' == null; 1 == '1y?z';
 * @param mixed $value1
 * @param mixed $value2
 * @return boolean True if values are equal, otherwise false.
 */
function sto_equals($value1, $value2)
{
  // identical in value and type
  if ($value1 === $value2)
    $result = true;
  // one is null, the other not
  else if (is_null($value1) || is_null($value2))
    $result = false;
  // one is an empty string, the other not
  else if (($value1 === '') || ($value2 === ''))
    $result = false;
  // identical in value and different in type
  else
  {
    $result = ($value1 == $value2);
    // test for wrong implicit string conversion, when comparing a
    // string with a numeric type. only accept valid numeric strings.
    if ($result)
    {
      $isNumericType1 = is_int($value1) || is_float($value1);
      $isNumericType2 = is_int($value2) || is_float($value2);
      $isStringType1 = is_string($value1);
      $isStringType2 = is_string($value2);
      if ($isNumericType1 && $isStringType2)
        $result = is_numeric($value2);
      else if ($isNumericType2 && $isStringType1)
        $result = is_numeric($value1);
    }
  }
  return $result;
}

J'espère que cela aidera quelqu'un à rendre sa candidature plus solide. L'article original se trouve ici : Égaux ou non égaux

1voto

bumperbox Points 6596

Presque toutes les valeurs non nulles sont converties en vrai en php dans les coulisses.

donc 1, 2, 3, 4, 'Hello', 'world', etc. seraient tous égaux à vrai, alors que 0 est égal à faux.

la seule raison pour laquelle !== fonctionne, c'est parce qu'il compare les types de données qui sont les mêmes.

1voto

elitalon Points 2894

Parce que PHP effectue un cast automatique pour comparer des valeurs de types différents. Vous pouvez voir un tableau des critères de conversion de type dans la documentation PHP.

Dans votre cas, la chaîne "Hello" est automatiquement converti en un nombre, qui est 0 selon PHP. D'où la valeur réelle.

Si vous voulez comparer des valeurs de types différents, vous devez utiliser les opérateurs de sécurité de type :

$value1 === $value2;

ou

$value1 !== $value2;

En général, PHP évalue à zéro toute chaîne qui ne peut pas être reconnue comme un nombre.

0voto

WernerBatt Points 21

En php, la chaîne "0" est convertie en booléen FALSE. http://php.net/manual/en/language.types.boolean.php

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