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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top