2009-11-16 9 views
1

Je travaille actuellement dans « la programmation PHP » O'Reilly et je suis venu dans ce tableau intitulé « Type de comparaison effectuée par les opérateurs de comparaison »:Comparaison PHP Opérateurs et types de données

 
First Operand    | Second Operand    | Comparison 
----------------------------------------------------------------------- 
Number      | Number      | Numeric 
String that is numeric  | String that is numeric  | Numeric 
String that is numeric  | Number      | Numeric 
String that is not numeric | Number      | Lexicographic 
String that is numeric  | String that is not numeric | Lexicographic 
String that is not numeric | String that is not numeric | Lexicographic 

Ma règle de Le type de comparaison est "numérique si et seulement si au moins un opérande est un nombre ou si les deux opérandes sont des chaînes numériques". Cela semble être pris en charge par le php.net page on Comparison Operators, qui indique "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, ils sont comparés comme des entiers." Toutefois, cela impliquerait que la comparaison dans la quatrième ligne de la table devrait être "numérique". La table contient-elle une erreur ou ma règle est-elle incorrecte?

+0

Votre règle est fausse. Essayez de comparer '" chaîne "== 0' et' intval ("chaîne") == 0' –

+0

@Ast Derek: Le résultat des deux comparaisons semble être vrai. – user200783

Répondre

2

Edité: Un visage complet basé sur les commentaires.

Votre récapitulatif est correct et la table est erronée. Une conversion est tentée sur le bit numérique au début de la chaîne si un opérande est numérique. La conversion renvoie zéro s'il n'y a pas de repère numérique. La conversion a lieu pour les décimales et les résultats rationnels des calculs, pas seulement des entiers.

Le code ci-dessous montre les comportements

 

if (2 > '10 little pigs') 
     print 'Integer does not coerce string'."\n"; 
else 
     print 'Integer does coerce string'."\n"; 

if (2.5 > '10 little pigs') 
     print 'Decimal does not coerce string'."\n"; 
else 
     print 'Decimal does coerce string'."\n"; 

if (5/3 > '2 little pigs') 
     print 'Rational result does not coerce string'."\n"; 
else 
     print 'Rational result does coerce string'."\n"; 

if (0 == 'No little pigs') 
     print 'Non numeric coerced to zero'."\n"; 
else 
     print 'Non numeric not coerced'."\n"; 

if (-0.156 > '-127 is a minumum value of a signed 8 bit number') 
     print 'Negative decimal does coerce string'."\n"; 
else 
     print 'Negative decimal does not coerce string'."\n"; 

if ('-0.156' > '-127') 
     print 'Both are converted if all numeric'."\n"; 
else 
     print 'No conversion if both are all numeric'."\n"; 

if ('-0.156' > '-127 is a minumum value of a signed 8 bit number') 
     print 'Successful conversion of one does coerce the other'."\n"; 
else 
     print 'Successful conversion of one does not coerce the other'."\n"; 
 
+0

L'instruction php.net indique "Si vous comparez un entier avec une chaîne, la chaîne est convertie en nombre." Cela n'implique-t-il pas que la comparaison d'un entier avec une chaîne (n'importe quelle chaîne, numérique ou non) est numérique? Cela ne correspond pas à votre "traduction". – user200783

+0

Relire la page php.net il semble y avoir une discordance dans la terminologie entre la table que vous citez et la page. Il semblerait que toutes les valeurs numériques ne se comportent pas également. J'essaye de trouver un morceau de code de démo pour l'affaire. – Bell