【问题标题】:why is a strpos that is !== false not true?为什么 !== false 的 strpos 不正确?
【发布时间】:2018-09-27 18:30:00
【问题描述】:

考虑以下示例:

$a='This is a test';

如果我现在这样做:

if(strpos($a,'is a') !== false) {
    echo 'True';
}

得到:

True

但是,如果我使用

if(strpos($a,'is a') === true) {
    echo 'True';
}

我什么也得不到。为什么在这种情况下!==false 不是===true 我检查了strpos() 上的 PHP 文档,但没有找到任何解释。

【问题讨论】:

  • 如果你把=== true 拿出来,你会得到你的“真实”声明,因为strpos 会返回一个1 而不是一个零——即if(strpos($a,'is a'){
  • === 正在寻找设置为 truebool -- 而 1 在技术上 true -- 它不是字面意思 true --- 而=== 正在寻找字面比较
  • Pete,@Zak 的信息对你有意义吗?我认为您的问题表明您可能正在为真与真、假与假而苦苦挣扎。
  • 是的,我想我不知道正整数(如果它找到字符串,则 strpos 传递)在 === 意义上不等于 true,而仅在 == 意义上.最终,Barmar 在下面关于类型转换的答案中对我的评论的回复清除了它。这确实应该在 strpos 的 php 手册中。

标签: php boolean strpos stripos


【解决方案1】:

Because strpos() never returns true:

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

如果没有找到针,则返回 FALSE。

如果没有找到针,它只返回一个布尔值。否则它将返回一个整数including -1 and 0,其中包含针出现的位置。

如果你这样做了:

if(strpos($a,'is a') == true) {
    echo 'True';
}

通常你会得到预期的结果,因为任何正整数都被认为是一个真实的值,并且因为当你使用 == 运算符时类型杂耍,结果将是真实的。 但是如果字符串位于字符串的开头,则由于返回零,这是一个错误的值,因此等于 false。

【讨论】:

  • 啊好的。我认为一个正整数也可以算作真。
  • @pete,确实如此。但是这个函数也返回零,即false
  • @Pete 当您使用=== 时,没有类型转换。如果值是不同的类型,它们永远不能是===
  • 我明白了。感谢您的澄清。从 php 手册中我不清楚。
  • 你是说strpos 可能会返回-1...!?
【解决方案2】:

strpos 函数在成功时返回一个整数值,仅当在字符串中未找到针时返回 false。在我们的例子中,字符串“This is a test”包含“is a”。所以测试(位置)!==false [其中位置是'is a'的第一次出现] 在类型和值上都与 false 不同,并且将返回 true。

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多