Eu gostaria de usar um resultado verdadeiro/falso para fazer coisas alternativas em PHP. Fiquei surpreso com o seguinte:
$falsevar = false;
$truevar = true;
echo "falsevar which I just set to false is".$falsevar; //displays true
echo "truevar which I just set to true is".$truevar; //displays 1
Saída:
falsevar which I just set to false istruevar which I just set to true is1
O que devo fazer com esse resultado? Por que o PHP ecoaria falso como verdadeiro?
Confundindo-me ainda mais, meu caso de uso é o seguinte:
$prompt = "I would like a sandwich to eat";
$myarray = array("pizza", "hamburger", "hot dog");
$wantsItem = false;
foreach ($myarray as $needle) {
if (strpos($prompt, $needle) != false) {
echo "Match found: {$needle}\n";
$wantsItem = true;
}
}
echo "wants item is".$wantsItem;
Quando executo isso que acredito que deveria retornar falso, nada ecoa.
falsevar which I just set to false istruevar which I just set to true is1value of wants item
Alguém pode me explicar o comportamento de verdadeiro e falso em PHP? (Observe que entendo que verdadeiro e falso não diferenciam maiúsculas de minúsculas, portanto esse não deve ser o problema.)
Obrigado por qualquer sugestão.
O que você está vendo é o resultado de "type malabarismo" , onde você tem uma variável que é booleana e a está usando em algum lugar onde precisa de uma string.
As regras para isso estão descritas na seção "Strings" do manual :
Seu primeiro exemplo é um pouco confuso, porque você não compensou o valor com uma nova linha ou outro separador, e suas strings começam com "falsevar" e "truevar", dificultando muito a leitura da saída. Aqui está uma versão mais clara:
Conforme descrito no manual, isso resulta em:
Para depuração, geralmente é mais útil usar uma função como
var_dump
, que fornece uma descrição de um valor. No seu segundo exemplo, você poderia escrever isto:Isso dá a saída:
Além disso, como apontou Robert Mihai Ionas, você tem um bug sutil em seu código, não relacionado à pergunta:
strpos
retorna0
para "correspondências no início" efalse
para "não corresponde", e isso causa um problema diferente de malabarismo de tipo: ambos são "valores falsos". Portanto , como observa astrpos
página de manual , você deve usarstrpos($prompt, $needle) !== false
em vez destrpos($prompt, $needle) != false
.Como alternativa, você pode usar a função adicionada recentemente
str_contains
, que não apresenta esse problema complicado.Isso não acontece.
false
é ecoado como uma string vazia.truevar
na sua saída está o início da segunda string que você ecoa, não o valor de$falsevar
.teria ficado mais claro se você colocasse as saídas em linhas separadas.
Então a saída teria sido:
Use !== false porque 0 é igual a false