PHP逻辑运算符之真或假。

3
作为一个 PHP 新手,我试图阅读其他人的代码以便学习。今天我遇到了这样一行代码:
if ( stripos($post_to_check->post_content, '[' . $shortcode) !== false )

我想知道!==false==true有什么区别。如果有人能够解释一下,我将不胜感激。 如果没有真正的区别,那么使用引用的一个而不是另一个的原因是什么?

http://php.net/manual/en/language.operators.comparison.php - hakre
1
可能是参考 - PHP中这个符号是什么意思?的重复。 - hakre
@hakre 不完全是这样 - 它没有解释为什么在这个特定情况下使用它 - Pekka
1
@Obmerkronen:我不明白你的评论。哪两个变量? - hakre
对不起,我会尝试更好地解释我的疑问。我能理解 $a !== $b 和 $a != $b 之间的区别。但是我写的那行代码,如果我没记错的话(我可能错了),是在检查一个字符串是否出现在另一个字符串中。它并不是在比较两个变量。所以如果有出现,它将返回 true,如果没有出现,它将返回 false。在这种特定情况下,!==false 和 ==true 有什么区别?现在,就像我说的,我是一个相当新手 - 所以可能还有其他我忽略的东西。 - Obmer kronen
显示剩余2条评论
4个回答

6

PHP是一种弱类型语言。==匹配两个值,===匹配值以及值的数据类型。

if (8 == '8') // returns true

上述条件只匹配值而不是数据类型,因此if会评估为TRUE
if (8 === '8') // returns false

同时检查值和数据类型的语句应使用 === ,因此这个 if 语句评估为 FALSE

当您只需要比较值而不是数据类型时,请使用 ==

在您的情况下, stripos 返回子字符串在字符串中的位置,如果未找到字符串,则返回 FALSE

if ( stripos($post_to_check->post_content, '[' . $shortcode) !== false )

上面的代码检查字符串中的子字符串,并且只有在找到子字符串时才会评估为TRUE。 如果您将其更改为

if ( stripos($post_to_check->post_content, '[' . $shortcode) != false )

当子字符串在主字符串的0位置找到时,即使子字符串存在于主字符串中,if语句也会返回FALSE。然后条件将变成这样:

if ( 0 != false )

这将导致评估为FALSE,因为0被视为FALSE

因此,您必须使用!==

if ( 0 !== false )

这将比较两个值的数值和数据类型。 值0是整型,而falseboolean类型,因此数据类型不匹配,条件会被认为是TRUE
PHP手册页面指出这些比较运算符。您应该查看一下。

感谢Shakti的回答,尽管它并没有准确回答我直接提出的疑问(我问的是!==false和==TRUE之间的区别,而不是!== false和!= false之间的区别)。但是,我明白了这一切都与我作为新手的身份有关,不知道stripos()函数不是真/假函数。它返回一个值或FALSE。在这种情况下,我理解为什么特定的程序员要使用它。我仍然不知道!==false和==TRUE之间的区别是什么... - Obmer kronen

3
!==false==true的区别在于PHP中完全相同/不完全相同和相等/不相等比较之间的区别。
请参阅PHP手册中的比较运算符,了解“完全相同”和“相等”的区别。

感谢Harke的回答,就像之前所说,我已经阅读了那个页面。我不知道的是stripos()不是一个真/假函数,它是一个值/假函数。如果它是一个真/假函数,我仍然不明白!==false和==true之间的区别(除非"true"和"false"可以是一个字符串??) - Obmer kronen
== 表示相等比较。=== 表示恒等比较。!== 是恒等比较的否定,而不是相等比较的否定。也许这就是重点? - hakre
就像我说的,我理解相等性!= 相同 :-) 无论如何,我非常感谢你们所有人的回答,我学到了很多,即使从这个问题的起伏来看 - 即使是经验丰富的用户也对此有疑虑...再次感谢。 - Obmer kronen

1

!== 是一种比较运算符,它不仅比较变量的,还比较变量的类型

这里使用它是因为 stripos 可能返回false,当没有匹配时,但也可能在字符串的第一个字符中找到匹配并返回0

== 无法区分这两种情况(它们都是“虚假”),因此在使用 stripos 时必须使用 ===。在 manual 中有一个警告:

此函数可能返回布尔值 FALSE,但也可能返回一个评估为 FALSE 的非布尔值,如 0 或“”。请阅读布尔部分以获取更多信息。使用 === 运算符来测试此函数的返回值。


-1
注意:==true和===true是不同的。
我认为!==false类似于===true,因此只需要解释==true和===true。对于第一个==,它在值上相等,因此1 == true,0 == false。对于===,在PHP中它是“相同”的,即在值和类型上都相等。
因此,如果结果在第0个位置,则结果应为true;但是,如果使用==true,则不起作用,因为0!= true。
例如, stripos('a sheep','a') 如果您使用==true,则结果是错误的,因为它在第一位。

为什么每个人都在像这样点踩完全有效的答案呢? 这是一个很好的观点和有帮助的!说真的,我感觉StackOverflow的质量开始向维基百科的方向发展,因为它正在获得越来越高的曝光率... - ՕլՁՅԿ

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