logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [php] petite bizarrerie sur les égalités  (Lu 5242 fois)
S0410N3
Administrateur

Profil challenge

Classement : 10/55046

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1260


Voir le profil WWW
« le: 20 Mars 2007 à 17:25:33 »

J'ai remarqué un petit truc aujourd'hui sur php et qui est assez vicieux :

Code:
<?php
$nb1
="00000001";
$nb2="0001";

if(
$nb1==$nb2)
  echo 
"$nb1=$nb2\r\n";
else
  echo 
"$nb1!=$nb2\r\n";
  
if(
strval($nb1)==strval($nb2))
  echo 
strval($nb1)."=".strval($nb2)."\r\n";
else
  echo 
strval($nb1)."!=".strval($nb2)."\r\n";
  
if(
$nb1===$nb2)
  echo 
"$nb1=$nb2\r\n";
else
  echo 
"$nb1!=$nb2\r\n";
?>
Ceci produit :

00000001=0001
00000001=0001
00000001!=0001

Etonnant non ? Je n'avais jamais remarqué ce comportement perso. En général ça se produit plus dans l'autre sens où il interprète un nombre comme une chaîne et où on est obligé de coller un intval().

Donc en gros il y a vraiment intérêt d'utiliser le triple = quand on bosse sur des chaînes avec des nombres dedans et des 0 au début (du binaire par exemple ).
Ca m'a rendu fou un bon moment cette connerie...

Autant je comprends la première égalité parce qu'il doit interpréter des nombres, autant la deuxième me laisse perplexe ou alors je ne comprends pas bien le rôle de strval()...
Si quelqu'un a une explication au pourquoi ça marche pas avec les strval() je suis preneur.

Question bonus : sur quelle épreuve est-ce que je me prenais la tête ? j/k
Journalisée

Enjoy (copyleft de quelqu'un qui a trop parlé)

S0410N3

-------------------------------------------------------------------------------------
La folie est le prix à payer pour le temps passé à être trop lucide.
-------------------------------------------------------------------------------------
http://forum.hardware.fr/hfr/Discussions/Societe/francais-repere-repaire-sujet_19265_1.htm
Zmx

Profil challenge

Classement : 75/55046

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 559


Voir le profil WWW
« #1 le: 20 Mars 2007 à 17:49:28 »

Je voit pas ce qui te choque dans la 2eme qui ne te choque pas dans la premiere.

1) tu a des chaine, tu les compore avec "==" et il a l'air de considéré que c'est des chiffre?
2) Tu as des chaine, que tu transfrome en chaine et tu les compare avec un ==. en gros c'est comme pour le cas 1

Ca prouve plutot bien que avoir des var non typé c'est chiant, au moins en perl on a eq et neq pour les chaines. (ça existe pas en php ? )

Edit: Ptet qu'utiliser strcmp pourrais etre une bonne idée.
Journalisée

akhenathon
Profil challenge

Classement : 177/55046

Membre Complet
***
Hors ligne Hors ligne
Messages: 187


Voir le profil WWW
« #2 le: 20 Mars 2007 à 18:02:22 »

étant donnée que le php n'est pas trés doué avec les 0 à gauche cela ne me choque pas beaucoup
Journalisée

______________________________________________

Akhenathon
S0410N3
Administrateur

Profil challenge

Classement : 10/55046

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1260


Voir le profil WWW
« #3 le: 20 Mars 2007 à 18:06:10 »

Ah ouais effectivement vu comme ça c'est logique... thx

Non ça n'existe pas eq et ne en php. C'est sûr que là ça serait plus pratique. Au moins en perl on sait sur quoi on bosse.

Sinon ouais j'avais pensé au strcmp.
En gros je disais juste ça pour dire qu'il faut faire gaffe. On chope des sales habitudes avec les variables auto-typées et dans certains cas, comme celui-ci, ça peut franchement poser problème.
Journalisée

Enjoy (copyleft de quelqu'un qui a trop parlé)

S0410N3

-------------------------------------------------------------------------------------
La folie est le prix à payer pour le temps passé à être trop lucide.
-------------------------------------------------------------------------------------
http://forum.hardware.fr/hfr/Discussions/Societe/francais-repere-repaire-sujet_19265_1.htm
the lsd
Administrateur

Profil challenge

Classement : 183/55046

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3098

poulping for fun & profit


Voir le profil WWW
« #4 le: 20 Mars 2007 à 22:27:32 »

Citation de: S0410N3
Question bonus : sur quelle épreuve est-ce que je me prenais la tête ? j/k
Tu serais pas en train de faire un codeur/decodeur de base64 toi ???

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
S0410N3
Administrateur

Profil challenge

Classement : 10/55046

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1260


Voir le profil WWW
« #5 le: 21 Mars 2007 à 00:04:56 »

Non, je bossais sur la crypto transmission
Journalisée

Enjoy (copyleft de quelqu'un qui a trop parlé)

S0410N3

-------------------------------------------------------------------------------------
La folie est le prix à payer pour le temps passé à être trop lucide.
-------------------------------------------------------------------------------------
http://forum.hardware.fr/hfr/Discussions/Societe/francais-repere-repaire-sujet_19265_1.htm
Nebelmann

Profil challenge

Classement : 470/55046

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1357


Voir le profil
« #6 le: 21 Mars 2007 à 08:47:09 »

Exemple          Nom           Résultat
$a == $b         Egal           TRUE si $a est égal à $b.
$a === $b      Identique  TRUE si $a est égal à $b et qu'ils sont de même type (introduit en PHP 4).
Il compare donc sur la valeur, et pas sur le type, dans ton deuxième test... même en rajoutant un strval (qui je pense ne change rien puisque tu avais déjà une chaîne de caractères au départ).
Mais bon, vu les incohérences qu'on peut trouver dans PHP, ce n'est pas plus étonnant que ça ^^.
Journalisée

-- Nebelmann -- Registered linux user #429186
«Si les lecteurs étaient des compilateurs, les posteurs feraient peut-être davantage attention à ce qu'ils écrivent...»
Pages: [1]
  Imprimer  
 
Aller à: