【问题标题】:Should one use strict comparison in Strings?应该在字符串中使用严格比较吗?
【发布时间】:2010-11-19 21:08:14
【问题描述】:

我知道,例如,使用:

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

结束:

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

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

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

似乎与以下内容完全相同:

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

如果有人可以为这个主题带来一些启发,我很感激。

【问题讨论】:

    标签: php string comparison string-comparison strict


    【解决方案1】:

    当您可以使用其中一个或另一个时,请选择严格比较,因为:

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

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

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

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

    相同
    if (TRUE)
    

    因此,由于您将始终比较至少一个变量,因此您必须假设您可能会得到意想不到的结果。

    您可以在http://net-beta.net/ubench/ 上查看各种严格与松散比较的基准测试结果。我也进行了自己的测试并发现了相同的结果。

    这是一种微优化,这意味着您不应更改现有代码,因为它不会产生明显的影响,但如果您正在编写新代码,您不妨练习使用最有效的技术。

    【讨论】:

    • 谢谢。顺便说一句,这些测试net-beta.net/ubench/index.php?t=array10 似乎并不相同。你经营那个网站?
    • 该网站是一个参考。我不运行它。 net-beta.net/ubench/ 是各种基准测试的集合。如果您向下滚动到 equal1 - equal7,您将找到比较测试。不幸的是,整个页面中没有 id 或命名的锚点,所以我无法具体链接到测试组。
    【解决方案2】:

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

    但是,在某些情况下,您不确定某个值是否会是一个字符串 - 例如,对于 $_GET 和 $_POST 变量。考虑以下几点:

    $_GET['foo'] == ""
    

    如果foo 作为空白字符串传入,上述表达式的计算结果为真,但如果没有为foo 传入任何值,它也将计算为真。相比之下,

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

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

    【讨论】:

    • 在您的示例中,如果根本没有将任何值传递给“foo”,您将收到 PHP E_NOTICE 级别错误。
    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2013-05-06
    • 2022-12-05
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    相关资源
    最近更新 更多