在字符串比较中是否应该使用严格比较?

3

我知道,例如使用:

if (in_array('...'), array('.', '..', '...') === true)

关于:

if (in_array('...'), array('.', '..', '...') == true)

可以提高性能并避免一些常见错误(例如1 == true),但我想知道是否有理由在字符串上使用严格比较,例如:

if ('...' === '...')

看起来做的事情与以下代码完全相同:

if ('...' == '...')

如果有人能够解释一下这个主题,我会很感激。
2个回答

7
如果您知道两个值保证是字符串,那么 == === 是相同的,因为两者之间唯一的区别是 === 检查类型是否相同,而不仅仅是有效值。
然而,在某些情况下,您不确定一个值是否是字符串-例如,像$_GET和$_POST变量这样的东西。请考虑以下内容:
$_GET['foo'] == ""

上述表达式将在以下情况下评估为true:如果空字符串作为foo传入,但是如果根本没有传入foo的值,它也会评估为true。相比之下,
$_GET['foo'] === ""

只有在明确传入空字符串时,才会评估为true - 否则,$_GET['foo']的值可能等同于空字符串,但类型不是空字符串,因为它实际上是该索引的空值,而不是字符串。


1
在你的例子中,如果根本没有任何值传递给'foo',你会得到一个PHP E_NOTICE级别的错误。 - Jani Hartikainen
请查看此链接并阅读底部的评论,以了解主要的比较问题,例如在 PHP 8.0.0 之前,“php” == 0 是 true*!https://www.php.net/manual/en/types.comparisons.php - Taha Khan
这是错误的。我刚遇到了十六进制代码的问题。var_dump("0E1234" == "0"); // true。在使用宽松比较时,PHP将以0E开头的字符串解释为科学数字表示法,变得与"0"相等。 - Ti Hausmann

4

当你可以使用其中之一时,请选择严格比较,因为:

  1. 它具有更好的性能
  2. 它可以防止意外结果

当比较字符串时,你仍然可能会得到意外的结果,因为一个字符串可能为空,或者你认为是字符串的变量实际上不是。

你永远不会使用两个字符串字面值的比较,因为它总可以被简化为TRUE或FALSE。例如:

if ('...' === '...')

相同
if (TRUE)

因为你总是会比较至少一个变量,所以你必须假设可能会有意外的结果。
你可以在http://net-beta.net/ubench/上查看各种严格比较和宽松比较的基准测试结果。我也进行了自己的测试,并得出了相同的结果。
这是一项微小的优化,这意味着你不应该更改现有的代码,因为这不会产生明显的差异,但如果你正在编写新代码,最好练习使用最有效的技术。

谢谢。顺便说一下,这些测试 http://net-beta.net/ubench/index.php?t=array10 似乎不是等价的。你运营那个网站吗? - Alix Axel
该网站是一个参考。我并不管理它。net-beta.net/ubench/ 是各种基准测试的集合。如果您向下滚动到equal1 - equal7,您将找到比较测试。不幸的是,在整个页面中没有id或命名锚点,因此我无法链接到特定的测试组。 - None

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