O valor booleano vira numérico em PHP
Pergunta
EDITAR:Acredito que minha confusão provavelmente seja criada por este código no topo da página em que estou testando o valor da opção...Isso cria um método de atalho para se referir à opção sem usar o método get_option('option')...
global $options;
foreach ($options as $value) {
if (get_settings( $value['id'] ) === FALSE) {
$$value['id'] = $value['std'];
} else {
$$value['id'] = get_settings( $value['id'] );
}
}
E então quando eu defino o valor de uma variável, $myvar, através de uma caixa de seleção marcada no painel de opções do meu tema e clico em salvar, então visualizo meu options.php em worpdress, o valor da variável é
true
E quando eu faço uma pesquisa nesta variável usando
if($myvar == "true")
Isso passa.
No entanto, quando defino o valor diretamente através do método update_options(), assim...
$mvar = true;
update_option('myvar', $myvar);
O valor muda de verdadeiro para 1
E quando faço a mesma comparação de antes, if($myvar == "true"), agora ela falha.Já não é “verdade”.
o que estou perdendo?(1) por que "true" e 1 não são avaliados da mesma forma e (2) O que o método update_option está fazendo com o valor de myvar para alterar o valor de true para 1?
Solução
Tentar
if($myvar == true)
e
$myvar = true;
TRUE
e FALSE
são variáveis booleanas incorporadas ao PHP que são muito mais universais do que uma string verdadeira.
Sobre a opção update_.Pode não ser que a opção esteja alterando para 1.Em vez disso, pode ser que, ao inseri-lo no banco de dados, ele o insira como a string "true"
.Então, quando volta, é convertido para o valor booleano true
, que quando impresso é 1
Outras dicas
Tentar
if ($myvar)
Não teste se as coisas são "iguais" à verdade, elas são verdadeiras ou não.
Você deve mudar seu primeiro teste para if($myvar == true)
ou simplesmente if ($myvar)
. O PHP tem algumas regras estranhas para o que é "verdadeiro"; Geralmente, as cordas se evitam para verdade, exceto os casos especiais de "0"
e uma corda vazia ""
, que tipo de Cast a False.
Em seu exemplo específico, if ($myvar == "true")
:
- Se
$myvar
contém um booleano, a expressão avaliará como(bool) == (bool)"true"
, ou(bool) == true
- Se
$myvar
contém um número inteiro, ele é fundido para uma corda e comparado com a string "true"; Portanto, seu teste está falhando, porque "1"! = "Verdadeiro". - Se
$myvar
é uma string, a comparação de strings ocorre e, de repente, apenas a string literal "True" comparará com sucesso.
Eu acho que 2º e 3º casos estão em vigor: o WordPress provavelmente está configurando $myval
para a string "true"
Quando o de From é postado de volta, seu teste passa. Quando você especifica manualmente booleano true
, WordPress deve estar convertendo -o em um número inteiro e, em seguida, comparação inteira ocorre e falha, porque o número inteiro 1 será lançado para cordas "1"
quando comparado contra "true"
.
Tenho certeza que você está ficando abaixo da força perto:
Porque emulador Android não está tendo nenhuma entrada de áudio para gancho. Anexar o microfone ou fone de ouvido e testá-lo.
"True" é uma corda, e todas as cordas se evitam para o booleano 1 (tente lançar (bool) $string
. true
Por outro lado, sem cotações, é um booleano e avaliará como 1.