2009-09-14 4 views
3

PHP:Pourquoi comparaison et empty() se comportent-ils comme ça en PHP?

$a = "0"; 
$b = "00"; 
var_dump(empty($a)); # True (wtf?) 
var_dump($a == $b); # True... WTF??? 
var_dump(empty($b)); # False WWWTTTFFFF!!?? 

J'ai lu les documents. Mais les docs ne donnent pas d'explication quant à pourquoi ils l'ont conçu de cette façon. Je ne cherche pas de solutions de contournement (je les connais déjà), je cherche une explication.

Pourquoi est-ce comme ça? Cela rend-il certaines choses plus faciles d'une manière ou d'une autre?

+3

J'imagine que cela a quelque chose à voir avec le manque de types en PHP. Les résultats de 'is_numeric ($ a)', 'is_int ($ a)' seraient probablement intéressants pour vous aussi. –

+0

PHP ne manque pas de types ... – strager

+0

@stranger - Par "manque", je veux dire qu'il peut convertir en interne tous les types à tous les autres types d'une manière ou d'une autre, et cela est généralement géré automatiquement. –

Répondre

1

Tout découle de la concepteurs de langage objectif de « faire la bonne chose ».

Ceci est un morceau de code donné devrait faire ce que le programmeur niave ou spectateur occasionnel d'un morceau de code attendrait aussi. Ce n'était pas un objectif facile à atteindre. Php a évité la plupart des pires pièges des autres langages (comme C si (a = b) {... ou perl si ("xxxx" == 0) {print "True!";}). Le 0 == 0000 et if ("000") {echo "True!"; } sont deux des rares cas où le code peut ne pas faire exactement ce que vous attendez, mais en pratique c'est rarement un problème. D'après mon expérience, la «guérison» en utilisant l'opérateur de comparaison exact === est la seule chose que l'on puisse garantir aux programmeurs php novices de se gratter la tête et de chercher dans le manuel.

+0

Jusqu'à présent, vous êtes le seul qui a réellement adressé ce que je demandait. – Fragsworth

2

http://au2.php.net/empty

Les choses suivantes sont considérées comme vides: "0" (0 comme une chaîne)

mais "00" ne sera pas considéré comme vide.

+1

comme pour n2 one - essayez la comparaison stricte === au lieu de la lâche == – DmitryK

+0

était censé être "comme pour le second - essayer ..." – DmitryK

0

Vérifiez les documents pour vide http://us.php.net/empty. Cela devrait prendre soin des première et troisième lignes. Pour la seconde, c'est parce que PHP est dynamiquement typé. l'interprète déduit le type de variables à utiliser dans le contexte dans lequel vous les avez utilisées. Dans ce cas, l'interpréteur pense probablement que vous essayez de comparer les nombres et de convertir la chaîne en ints avant de la comparer.

0

From the documentation On peut supposer que 0 peut être une chaîne int ou une chaîne de 1 caractère pour signifier vide. 00 serait plus une hypothèse de formatage car il n'y a pas de 00, mais il y a 0. 00 impliquerait un format 2 entier, mais la fonction empty() est seulement écrite pour 0.

FWIW IANA développeur php .

1

Cela a à voir avec ce que PHP considère comme vide, et, comme l'a imaginé @ Shadow, c'est un problème de frappe dynamique. 0 et 00 sont égaux aux yeux de PHP. Pensez à utiliser la stricte égalité à la place:

($ a === $ b) // est un égal à b et le même type (cordes)

9

En ce qui concerne la résolution de "0" == "00"true, la réponse se trouve dans Comparison Operators :

Si vous comparez un nombre entier avec une chaîne , la chaîne est converted to a number. Si vous comparez deux chaînes numériques , elles sont comparées en tant que nombres entiers . Ces règles s'appliquent également à l'instruction switch.

(italique ajouté)

Les deux "0" et "00" sont des chaînes numériques si une comparaison numérique est effectuée et évidemment 0 == 0.

Je suggère d'utiliser === à la place si vous ne voulez pas de conversion de type implicite.

En ce qui concerne empty():

Les choses suivantes sont considérées vides:

  • "" (une chaîne vide)
  • 0 (0 comme un entier)
  • "0" (0 en tant que chaîne)
  • NULL
  • FALSE
  • array() (tableau vide)
  • var $ var; (Une variable déclarée, mais sans valeur dans une classe)
Questions connexes