Je programme en PHP depuis près de 15 ans, et aujourd'hui je pose une question simple qui me laisse perplexe. J'ai besoin de vérifier si la chaîne est un "?" ... mais cela ne fonctionne pas. $ niveau = ...

2
Claude Deslandes 17 mars 2021 à 03:45

2 réponses

Meilleure réponse

Il s'agit de l'un des modifications incompatibles vers l'arrière, qui fonctionne très bien dans PHP 8 , mais pas dans la version PHP <8. Le problème ici est que vous comparez une chaîne avec un nombre, là où cela pourrait mal tourner.

0 == "foo" // True (PHP < 8) / False (PHP 8)

C'est parce que la valeur intégrale de toute chaîne est 0:

<?php
  echo intval("Hello"); // 0
  echo intval("?");     // 0

Et la comparaison avec 0 donne true.

Alors convertissez $niveau en chaîne, puis comparez pour une compatibilité descendante.

<?php
  $niveau = 0;
  $result = "Original";
  if ($niveau . "" == "?") {
    $result = "Found a question";
  }
  echo "Result :".$result;

Cela me donne:

Result :Original

Vérifiez ici sur toutes les versions!

Sinon, utilisez une vérification stricte avec trois ===:

if ($niveau === "?")
1
Praveen Kumar Purushothaman 17 mars 2021 à 00:54

Vous devez comparer la même variable de type. Quand a un type différent, le résultat peut ne pas être celui que vous attendiez.

"0" == "?" // is false
0 == "?"   // is true (PHP 7.3)

Lorsque vous comparez une chaîne avec int, la chaîne sera considérée comme un int.

intval("?") // which is 0 (PHP 7.3)

Donc 0 == 0 retournera vrai;

1
LF00 17 mars 2021 à 01:02