php 为什么 TRUE == “过期”?

php why does TRUE == "expired"?

提问人:rolinger 提问时间:3/26/2022 更新时间:3/26/2022 访问量:27

问:

这让我发疯了几个小时。

我有一个函数返回以下三个值之一:

function checkValid() {
   ...
   return array("expired",$oldDate,$newDate) ;
   return array(true,$oldDate,$newDate) ;
   return array(false,$oldDate,$newDate) ;
}

list($isValid,$oDate,$nDate) = checkValid() ;

if ($isValid == "expired") {
   ... 
   ...do blah
}

...每当条件返回时,都会触发。所以我做了一些测试,果然:trueif ($isValid == "expired") { ... }

$isValid = true ;
if ($isValid == "expired") {
   echo "Yup...some how 'expired' equals TRUE" ;
} else {
   echo "Nope....it doesn't equal true" ;
}

output:  Yup...some how 'expired' equals TRUE

当我将 if/condition 更改为:

$isValid = true ;
if ($isValid === "expired") {
   echo "Yup...some how 'expired' equals TRUE" ;
} else {
   echo "Nope....it doesn't equal true" ;
}

output: Nope....it doesn't equal true

我对此感到困惑。为什么会或???true == 'expired'1 == 'expired'

PHP 比较 运算符

评论

1赞 Don't Panic 3/26/2022
查看此表:php.net/manual/en/...。在这种情况下,操作数 1 是 bool ,因此字符串被转换为布尔值进行比较。true"expired"
1赞 Don't Panic 3/26/2022
将字符串转换为布尔值时,只有空字符串和字符串“0”的计算结果为 false。请参见:php.net/manual/en/...
0赞 rolinger 3/26/2022
@Don'tPanic - 那是坚果。我以为我理解了真理的概念,但这让我大吃一惊。我想我假设 JS truthy 也与 PHP truthy 相同......但。。。。不。
0赞 Don't Panic 3/26/2022
确实没有。:-)

答:

1赞 Pooya Estakhri 3/26/2022 #1

当使用两个等号时,php 会在引擎盖下键入 coersion 并检查真实情况,其中包括除 、boolean 之外的所有数字、除空字符串以外的所有字符串和其他一些情况。==0true

如果要检查完全匹配,则应使用三个等号===

评论

0赞 rolinger 3/26/2022
我确实通过使用...但我不明白为什么甚至仍然被认为是真实的。仍然对此感到困惑......尤其是与JS相比,这不会发生(我不认为)===true == 'expired'
0赞 Pooya Estakhri 3/26/2022
它确实发生在js中,并且解决方案是完全相同的,当两端的类型不同时,php检查的是类型转换。因此,您的字符串要么变为 false,要么变为 true。
0赞 Pooya Estakhri 3/26/2022
如果字符串为空或像“0”一样为 0,我猜可能还有其他几种情况,那么它的计算结果为 false,否则为 true
0赞 rolinger 3/26/2022
type casting- 我会继续阅读。我刚刚在 JS 中测试了它,它没有评估为真实/真实。 不将 HERE 输出到控制台。var a = true; if (a == "expired") { console.log("HERE") ; }
1赞 rolinger 3/26/2022
@PooyaEstkhri - 我想也许我对 JS truthy 的理解使我与我期望的 PHP truthy 混淆了。这简直太丑陋了。哈哈