Aujourd'hui, je jouais avec PHP, et j'ai découvert que les valeurs de chaîne "true" et "false" ne sont pas correctement analysées en booléen dans une condition, par exemple en considérant la fonction suivante:
function isBoolean($value) {
if ($value) {
return true;
} else {
return false;
}
}
Si j'exécute:
isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false
Cela ne semble fonctionner qu'avec les valeurs "1" et "0":
isBoolean("1") // Returns true
isBoolean("0") // Returns false
Existe-t-il une fonction native en PHP pour analyser les chaînes "true" et "false" en booléen?
isBoolean("")
doit retourner false.true
même si pour un lecteur humain, cela semblerait plus intuitif que cela signifiaitFALSE
.Réponses:
Il existe une méthode PHP native pour faire cela qui utilise la méthode filter_var de PHP:
Selon le manuel de PHP :
la source
FILTER_NULL_ON_FAILURE
à lafilter_var()
fonction et ne PAS le remplacer parFILTER_VALIDATE_BOOLEAN
comme je le pensais. Il en résultera le code suivant qui a fait l'affaire pour moi:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
La raison est que toutes les chaînes sont évaluées
true
lors de leur conversion en booléen, sauf"0"
et""
(chaîne vide).La fonction suivante fera exactement ce que vous voulez: elle se comporte exactement comme PHP, mais évaluera également la chaîne
"false"
commefalse
:La documentation explique que: http://php.net/manual/en/language.types.boolean.php :
la source
En PHP uniquement
"0"
ou la chaîne vide contraint à false; toute autre chaîne non vide contraint à true. À partir du manuel :Vous devez écrire votre propre fonction pour gérer les chaînes
"true"
vs"false"
. Ici, je suppose que tout le reste est par défaut faux:Sur une note latérale qui pourrait facilement être condensée en
la source
J'ai récemment eu besoin d'une fonction de conversion booléenne "lâche" pour gérer des chaînes comme celles que vous demandez (entre autres). J'ai trouvé quelques approches différentes et suis venu avec un grand ensemble de données de test pour les parcourir . Rien ne correspondait tout à fait à mes besoins alors j'ai écrit le mien:
Notez que pour les objets qui sont à la fois dénombrables et convertibles en chaîne, cela favorisera le décompte par rapport à la valeur de chaîne pour déterminer la véracité. Autrement dit, si
$object instanceof Countable
cela reviendra(boolean) count($object)
quelle que soit la valeur de(string) $object
.Vous pouvez voir le comportement des données de test que j'ai utilisées ainsi que les résultats de plusieurs autres fonctions ici . Il est un peu difficile de parcourir les résultats de cette petite iframe, donc vous pouvez afficher la sortie du script dans une page complète , à la place (cette URL n'est pas documentée, donc cela pourrait ne pas fonctionner éternellement). Au cas où ces liens meurent un jour, je mets également le code sur pastebin .
La ligne entre ce qui «devrait être vrai» et ce qui ne devrait pas est assez arbitraire; les données que j'ai utilisées sont classées en fonction de mes besoins et de mes préférences esthétiques, les vôtres peuvent différer.
la source
J'utilise cette construction pour transformer les chaînes en booléens, puisque vous voulez
true
pour la plupart des autres valeurs:la source
Non - les deux sont des chaînes, et ces deux (comme vous le dites) évaluent à
true
. Seules les chaînes vides sont évaluéesfalse
en PHP.Vous auriez besoin de tester cela manuellement. Dans la mesure du possible, cependant, il serait préférable de travailler avec des valeurs booléennes «réelles» à la place.
la source
true
en PHP.true
]" peut donner une mauvaise impression au débutant, en particulier celui d'une autre langue avec des règles de frappe plus strictes où une chaîne est une chaîne et le contenu n'a pas d'importance lorsqu'il est converti en booléen (comme Rubis)."0"
? Cela ne vaut-il pas égalementfalse
?Le moyen le plus simple de convertir en toute sécurité un booléen;
la source
Si votre API n'accepte que les chaînes "true" ou "false", tout le reste devenant
null
, alors essayez:Cela suppose que ce
$input
n'est pas un objet. Null coalesce (??
) a été introduit dans PHP 7.0.la source