2009-09-03 4 views
1

En PHP 0 est traité comme booléen faux. Par conséquent, chaque fois que je suis dans une situation où une fonction doit retourner une valeur numérique et je l'ai retourner 0, ou quand j'ai une colonne MySQL bool avec des valeurs possibles de 0/1, et j'utilise un code comme ceci:Quelles précautions devrais-je prendre en utilisant '0' dans PHP comme un nombre?

$active=(isActive()) ? 1 : 0; 
$this->db->set('isActive',$active); 

J'ai l'impression dans mon esprit que le 0 peut être converti en null ou en une chaîne vide, par exemple "".

Quelles précautions dois-je prendre pour que 0 soit toujours traité comme un integer et rien d'autre?

Répondre

1

Il existe quelques endroits où 0 et '0' sont traités un peu spécialement. C'est presque toujours à cause de la coercition de type automatique. Vous avez déjà remarqué où 0 évalue à false. Donc, si PHP a une raison de convertir '0' en nombre entier, alors cela sera également évalué à false. Le premier à surveiller est la fonction empty(). Ceci est documenté, BTW.

J'utilise rarement empty() en raison de ce problème très, en fait.Il est beaucoup plus logique de vérifier plus étroitement, par conséquent j'utilise isset(), is_null() et === false ou même == 0 (ou != 0). Il y a aussi d'autres vérifications. J'ai un code de gestionnaire DB qui vérifie non seulement en utilisant is_null() mais aussi is_numeric().

D'autres endroits à surveiller sont où vous utilisez le code d'autres développeurs qui ne sont pas complètement prudent avec la façon dont 0 fonctionne en co-ercion de type automatique. Si vous attribuez une 0 à une fonction, mais qu'il finit par utiliser un null alors qu'il devrait utiliser un 0, vous avez probablement trouvé un bogue dans l'API et vous devriez le soulever avec le développeur. En fait, ils utilisent probablement empty() alors qu'ils devraient utiliser isset() et/ou is_null(). :-)

1

Aucune. 0 vaut 0, même si les évaluations logiques considèrent qu'il s'agit d'une valeur fausse, cela ne change pas sa valeur réelle.

+1

Dans l'exemple de code que j'ai donné plus tôt, si j'utilise '$ this-> db-> set ('active', 0);' puis j'essaie d'insérer cet enregistrement dans le db, la valeur de l'enregistrement est en fait nul. Cependant, si je le change en '$ this-> db-> set ('actif', '0');' donc 0 est en guillemets simples, alors 0 est ajouté avec succès –

+1

Cela ressemble beaucoup plus à un problème avec la bibliothèque DB vous utilisez, pas avec PHP. – Amber

+0

La bibliothèque db met simplement la variable dans la requête, comme ceci: '" UPDATE .. SET active = '$ active' ";' –

4

Si vous voulez PHP pour évaluer une déclaration avec « faux » étant le seul « faux », l'utilisation === au lieu de l'habituel ==

2

PHP ne vous permet de jeter des variables à un certain type.

<?php 

    $value = (bool) 0; 
    $value3 = (int) 3; 

?> 

Si vous voulez toujours que 0 soit traité comme un int, créez-le en un.

-1

L'utilisation de l'opérateur de comparaison === est préférable car elle vérifie que les types sont égaux ainsi que leurs valeurs. En PHP si vous faites:

Votre meilleur pari est d'utiliser vrai et faux où vous le pouvez, plutôt que de mettre 1 et 0 pour les drapeaux. Dans votre exemple, faites:

$active=(isActive()) ? true : false; 

ou encore mieux (en supposant isActive retourne une valeur booléenne correcte):

$this->db->set('isActive',isActive()); 

plutôt que:

$active=(isActive()) ? 1 : 0; 
+0

Dans MySQL, bool est en fait une colonne de INT (1), qui stocke 0 ou 1. D'où votre méthode ne fonctionnera pas du tout. Je dois transmettre 0 et 1 exactement –

1

Je ne trouve pas d'un seul cas où PHP convertirait 0 en null ou "". S'il doit le convertir en une chaîne, ce sera "0", en un booléen ce sera false. Il n'y a pas de type "nul", donc vraiment votre 0 est sûr avec PHP. false est converti en "" (chaîne vide) lorsqu'il est converti en chaîne, mais les entiers sont sécurisés.

Maintenant, ce n'est pas une garantie que le code tiers ne se comportera pas étrangement lorsqu'il est passé un nombre entier lorsqu'il s'attendait à autre chose, mais vous êtes la plupart du temps en sécurité.

+0

En PHP, null est un type spécial qui a une valeur valide: null lui-même. – staticsan

0

Si vous définissez une variable sur 0, la variable reste à 0 sauf si vous l'avez convertie en autre chose. Le type est encore entier.

Vous pouvez vérifier si une variable utilise la fonction is_numeric().

Exemple:

$active=(isActive()) ? 1 : 0; 
if(is_numeric($active)){ 
    $this->db->set('isActive',$active); 
} 

Vous pouvez également utiliser l'opérateur de comparaison === au lieu des == habituels. il va comparer le type de données ainsi que le contenu de la variable.

$active=(isActive()) ? 1 : 0; 
if($active === 0 || $active === 1){ 
    $this->db->set('isActive',$active); 
} 

Espérons que cela aide!

Questions connexes