我想使用真/假结果在 PHP 中执行其他操作。我对以下情况感到惊讶:
$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
输出:
falsevar which I just set to false istruevar which I just set to true is1
我该如何理解这个结果?为什么 PHP 会将 false 回显为 true?
更让我困惑的是,我的用例如下:
$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;
当我运行这个我认为应该返回 false 的程序时,什么也没有回响。
falsevar which I just set to false istruevar which I just set to true is1value of wants item
有人可以向我解释一下 PHP 中 true 和 false 的行为吗?(请注意,我理解true 和 false 不区分大小写,所以这不是问题。)
谢谢您的任何建议。
您所看到的是“类型杂耍”的结果,其中您有一个布尔变量,并且在需要字符串的地方使用它。
该规则在手册的“字符串”部分中描述:
您的第一个例子有点令人困惑,因为您没有用换行符或其他分隔符来偏移值,并且您的字符串以“falsevar”和“truevar”开头,这使得输出很难阅读。这是一个更清晰的版本:
正如手册中所述,这会导致:
对于调试,使用像 这样的函数通常更有用
var_dump
,它会为您提供值的描述。在第二个示例中,您可以这样写:输出结果如下:
此外,正如 Robert Mihai Ionas 指出的那样,您的代码中有一个与问题无关的细微错误:对于“开头匹配”和“不匹配”
strpos
返回,这会导致不同的类型杂乱问题:两者都是“false-y 值”。因此,正如手册页所述,您应该使用而不是。0
false
strpos
strpos($prompt, $needle) !== false
strpos($prompt, $needle) != false
或者,您也可以使用最近添加的
str_contains
功能,它不会出现这个麻烦的问题。它没有。
false
被回显为一个空字符串。truevar
在您的输出中是您回显的第二个字符串的开头,而不是的值$falsevar
。如果你将输出放在单独的行上,那么将会更清晰。
那么输出将是:
使用 !== false 因为 0 等于 false