[spip-dev] [(#VAL{0}|intval|=={chaine})] renvoie 1...

Hello

Goetsu a trouvé un bug(?) tout à l'heure...
Un #ENV{*texte}|=={toto} retourne vrai si $texte = int(0).

De la même manière :
[(#VAL{0}|intval|=={chaine})] renvoie 1...

Jeu de test pour vérifier (à mettre dans les tests unitaires ensuite si valides ?) :

<br />
[(#VAL{0}|var_dump)] -> string(1) "0"<br />
[(#VAL{0}|intval|var_dump)] -> int(0)<br /><br />

(condition -> retour attendu : erreur)<br />
[(#VAL{0}|intval|=={a})] -> rien : ERREUR retourne 1<br />
[(#VAL{0}|intval|=={0})] -> 1<br />
[(#VAL{0}|intval|=={1})] -> rien<br />
[(#VAL{0}|intval|=={2})] -> rien<br /><br />

[(#VAL{0}|=={a})] -> rien<br />
[(#VAL{0}|=={0})] -> 1<br />
[(#VAL{0}|=={1})] -> rien<br />
[(#VAL{0}|=={2})] -> rien<br /><br />

[(#VAL{0}|=={'a'})] -> rien<br />
[(#VAL{0}|=={'0'})] -> 1<br />
[(#VAL{0}|=={'1'})] -> rien<br />
[(#VAL{0}|=={'2'})] -> rien<br /><br />

Goetsu a trouvé un bug(?) tout à l'heure...

c'est une "feature" de php

Si vous comparez un entier avec une chaîne, la chaîne est convertie
en un nombre. Si vous comparez deux chaînes numériques, elles seront
comparées en tant qu'entiers. Ces règles s'appliquent aussi à
l'instruction switch.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("1" == "1e0"); // 1 == 1 -> true

-- Fil

Fil a écrit :

Goetsu a trouvé un bug(?) tout à l'heure...

c'est une "feature" de php

PHP: Comparison - Manual

Merci Fil.
Je la connaissais pas celle là... sympa...

Fil a écrit :

Goetsu a trouvé un bug(?) tout à l'heure...

c'est une "feature" de php

PHP: Comparison - Manual

Si vous comparez un entier avec une chaîne, la chaîne est convertie
en un nombre. Si vous comparez deux chaînes numériques, elles seront
comparées en tant qu'entiers. Ces règles s'appliquent aussi à
l'instruction switch.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("1" == "1e0"); // 1 == 1 -> true

et de manière cohérente, "" est considéré comme false...
JL

Donc si je comprend bien je peux continuer à utiliser strval ?
(même si ne comprend pas bien l'intérêt d'un feature qui renvoie true qd on test si 0=="a")

Aurélien

en php on a === pour les cas ou l'on veut tester "egal en valeur et de meme type"
En l'occurence :
0=='a' => true
0==='a' => false

On peut l'ajouter aux filtres spip comme ==, mais cela risque d'embrouiller les newbies qui tomberont dessus ...
Cédric

oui ou plus simplement indiquer dans le doc le comportement exacte du == et qu'il est possible d'utiliser strval pour contourner le problème

Aurélien