Valeur booléenne devient numérique en PHP
Question
EDIT: Je crois que ma confusion est probablement créée par ce code en haut de la page dans laquelle je teste la valeur de l'option ... Cela crée une méthode de raccourci pour se référer à l'option sans utiliser le get_option procédé ( 'option') ...
global $options;
foreach ($options as $value) {
if (get_settings( $value['id'] ) === FALSE) {
$$value['id'] = $value['std'];
} else {
$$value['id'] = get_settings( $value['id'] );
}
}
Et quand je mets la valeur d'une variable, myvar $, par l'intermédiaire d'une case à cocher cochée dans le panneau de mon thème d'options et cliquez sur Enregistrer, puis voir mon options.php dans Worpdress, la valeur de la variable est
true
Et quand je fais une recherche sur cette variable en utilisant
if($myvar == "true")
Il passe.
Cependant, quand je définir la valeur directement via la méthode update_options (), comme ceci ...
$mvar = true;
update_option('myvar', $myvar);
Les changements de valeur de vrai à 1
Et quand je fais la même comparaison que précédemment, si ($ myvar == « true »), il échoue maintenant. Il n'est plus « vrai ».
Qu'est-ce que je manque? (1) pourquoi est « vrai » et 1, ne pas évaluer les mêmes et (2) Quelle est la méthode de update_option faire à la valeur de myvar pour changer la valeur de true à 1?
La solution
Essayez
if($myvar == true)
et
$myvar = true;
TRUE
et FALSE
sont de PHP construit dans les variables booléennes qui sont beaucoup plus universel que d'une véritable chaîne.
A propos de la update_option. Il pourrait ne pas être que l'option est en train de changer à 1. Au contraire, il est peut-être que le quand il est de l'insérer dans la base de données, il insère comme la chaîne "true"
. Puis, quand il revient, il est converti en la valeur booléenne true
, qui lors de l'impression est 1
Autres conseils
Essayez
if ($myvar)
Ne pas tester si les choses « égales » vraies, elles sont vraies ou ils ne sont pas.
Vous devez changer votre premier test à if($myvar == true)
ou tout simplement if ($myvar)
. PHP a quelques règles étranges pour ce qui est « vrai »; En général, les chaînes evaulate à true, à l'exception des cas particuliers de "0"
et une chaîne vide ""
, type moulé sous pression à false.
Dans votre exemple précis, if ($myvar == "true")
:
- Si
$myvar
contient une valeur booléenne, l'expression évaluera comme(bool) == (bool)"true"
, ou(bool) == true
- Si
$myvar
contient un entier, il est jeté à une chaîne et par rapport à la chaîne « true »; si votre test échoue, parce que "1"! = "true". - Si
$myvar
est une chaîne, la comparaison de chaînes a lieu et tout à coup que la chaîne littérale « true » comparera avec succès.
Je suppose cas 2e et 3e sont en vigueur: Wordpress est mise probablement $myval
à la chaîne "true"
lorsque l'est de réaffectés, donc passe votre test. Lorsque vous spécifiez manuellement true
booléen, Wordpress doit être le convertir en un entier, puis comparaison entière a lieu et échoue, car le nombre entier 1 sera castée chaîne "1"
par rapport contre "true"
.
Vous faites une comparaison lâche entre l'entier 1 et la chaîne « true ». Pour ce PHP se traduira par la chaîne à un certain nombre. 'Test' comme nombre est 0:
var_dump((int) 'true'); // int(0)
Et puisque 0 n'est pas égal à 1, la comparaison retourne faux.
Comme d'autres réponses déjà souligné à juste titre, vous devez tester contre le littéral booléen TRUE
ou true
. Si un opérateur dans une vérification de l'égalité est un booléen, PHP va convertir l'autre opérateur à un booléen aussi, qui, pour le numéro 1, donnera
var_dump((bool) 1); // boolean(true)
Et votre test passera, parce que le vrai est égal à true.
Consultez la type Tableau comparatif pour comprendre comment PHP jongle types quand test égalité.
Quant à ce que check_update
fait à votre booléen, consultez les :
(mixte) (obligatoire) La nouvelle valeur pour ce nom d'option. Cette valeur peut être une chaîne, un tableau, un objet ou une valeur sérialisée.
Donc, pas permis booléen. J'ai essayé brièvement de trouver de la sourcecode où la conversion a lieu, mais comme WP est un gâchis pour moi, n'a pas pu le trouver. Comme quelqu'un d'autre a suggéré, il arrive probablement lors de l'enregistrement à la base de données, puis le récupérer.
« true » est une chaîne, et toutes les chaînes evaulates au booléenne 1 (essayez coulée (bool) $string
. true
d'autre part, sans les guillemets, est une valeur booléenne et évaluera 1.