我已经用 PHP 编程将近 15 年了,今天我问了一个让我困惑的简单问题。我需要检查字符串是否是“?”...但它不起作用。
$niveau = 0;
$result = "Original";
if($niveau == "?") $result = "Found a question";
echo "Result :".$result;
输出: 结果:发现一个问题
问题,由于 $niveau
的值是 0
,if 语句不应该改变 $retour
的值,但它确实如此!为什么?有人可以解释这种行为吗?
答案 0 :(得分:1)
这是 Backward Incompatible Changes 之一,它在 PHP 8 中工作正常,但在 PHP 版本 <8 中不起作用。这里的问题是您将字符串与数字进行比较,可能会出错。
0 == "foo" // True (PHP < 8) / False (PHP 8)
这是因为,任何字符串的整数值都是0
:
<?php
echo intval("Hello"); // 0
echo intval("?"); // 0
与 0
比较得到 true
。
因此将 $niveau
转换为字符串,然后进行比较以实现向后兼容性。
<?php
$niveau = 0;
$result = "Original";
if ($niveau . "" == "?") {
$result = "Found a question";
}
echo "Result :".$result;
这给了我:
Result :Original
Check here 在所有版本上!
另一种方式,对三个 ===
使用严格检查:
if ($niveau === "?")
答案 1 :(得分:1)
您应该比较相同类型的变量。当有不同的类型时,结果可能不是你所期望的。
"0" == "?" // is false
0 == "?" // is true (PHP 7.3)
将字符串与 int 进行比较时,该字符串将被视为 int。
intval("?") // which is 0 (PHP 7.3)
所以 0 == 0
将返回真;