2009-08-15 62 views
0

我知道,例如,使用:应该在字符串中使用严格的比较吗?

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

在:

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

可以提高性能,并避免一些常见的错误(如1 ==真),但我想知道是否有一个原因是使用的字符串比较严格,如:

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

似乎做完全相同的事情:

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

如果有人能够给这个问题带来一些光,我很感激。

回答

6

如果您知道这两个值都保证为字符串,那么=====是相同的,因为两者之间的唯一区别是===将检查类型是否相同,而不仅仅是有效值。

但是,在某些情况下,您并不确定值是否会是一个字符串 - 例如,像$ _GET和$ _POST变量。考虑以下几点:如果foo传递作为一个空字符串

$_GET['foo'] == "" 

上述表达式的值为true,但如果没有值在所有通过在foo它也将评估为true。相比之下,

$_GET['foo'] === "" 

只评估为true,如果一个空字符串在明确传递 - 否则的$_GET['foo']的价值可能相当于一个空字符串,但类型不会是因为它实际上是一个空该索引的值,而不是一个字符串。

+1

在你的例子中,如果没有任何值被传递给'foo',你会得到一个PHP E_NOTICE级别的错误。 – 2009-08-15 11:22:09

+0

明白了,谢谢。 – 2009-08-15 11:22:31

3

当你可以使用一个或另一个选择严格的比较,因为:

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

比较字符串时,你仍然可以有意想不到的效果因为一个字符串可能是空的,或者你认为一个字符串实际上不是。

您永远不会使用两个字符串文字的比较,因为它总是可以减少为TRUE或FALSE。例如:

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

相同

if (TRUE) 

如此以来,你总是会被比较的至少一个变量,你必须假设你有意想不到的效果。

您可以在http://net-beta.net/ubench/处看到各种严格与宽松比较的基准测试结果。我也跑了我自己的测试,发现了相同的结果。

这是一个微型优化,这意味着你不应该改变现有的代码,因为它不会产生明显的差异,但是如果你正在编写新的代码,你可能会习惯使用最有效的技术。

+0

谢谢。顺便说一句,这些测试http://net-beta.net/ubench/index.php?t=array10似乎并不相同。你运行该网站? – 2012-12-05 01:10:15

+0

该网站是一个参考。我不运行它。 [net-beta.net/ubench/](http://net-beta.net/ubench/)是各种基准的集合。如果你向下滚动到equal1 - equal7,你会发现比较测试。不幸的是,在整个页面中没有ID或锚定,所以我无法专门链接到一组测试。 – 2012-12-05 01:33:59