评估stripos(),!== FALSE和=== TRUE有什么区别?

4

我有一个字符串的问题:

$val = 'NOT NULL';

if(stripos($val, 'NULL') !== FALSE){
    echo "IS $val";
}

它的评估结果良好,但如果我使用=== TRUE作为评估器,事情就会出错。 答案使我困惑不解,请帮助我理解。


2
=== 是严格比较,即匹配类型。由于 stripos 返回整数而不是布尔值,因此 stripos(...) === true 的结果为 false - Leri
谢谢!的确,现在很明显了...但由于某种原因,我卡在了错误的逻辑上。 - derei
在 PHP 中,整数也被视为布尔值,在 strposstipos 的情况下,它返回整数(同时字符串偏移从 0 开始)。而 === 是严格比较,即 0 不等于 false1 或更多 不等于 true - Shushant
@punk,我明白了...这很棘手。所以,如果我使用==只要偏移量大于0,我会得到TRUE,但如果偏移量= 0,我会得到一个误导性的FALSE。现在清楚了,只有与严格的FALSE进行比较,我才能得到真正的结果。 - derei
3个回答

8
如果您阅读 stripos() 的文档,您会发现:

返回针对于开始位置的干草堆字符串内存在的针的位置(与偏移量无关)。还请注意,字符串位置从0开始,而不是1。

如果未找到针,则返回FALSE

它不会返回TRUE。由于您使用了严格相等,您的条件将永远不会为true
如果您这样写stripos($val, 'NULL') == TRUE,那么只要PHP执行类型转换并有效地使0==(int)true,您的代码就会在位置0处找到NULL时执行。
使用stripos()测试存在的适当方式如下:
if (stripos($val, 'NULL') !== FALSE){
    echo "IS $val";
} 

1
答案是因为您正在使用严格相等运算符。该函数本身返回一个整数(如果未找到针,则返回布尔值)。返回值与true不相等(在严格意义上,即值和类型都不相等),这就是为什么检查失败的原因。

1

由于 === !==严格比较运算符 - !== false === true 不同,因为例如 1!== false 是可以的(值和类型不相等),但是 1 === true 不可以(值相等,但类型不相等)。

这个示例说明了严格比较的含义 - 即不仅关注值,还要关注所比较数据的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接