【问题标题】:PHP compare equality, empty string, "0" and 0PHP比较相等,空字符串,“0”和0
【发布时间】:2015-02-26 10:03:01
【问题描述】:

我了解到空字符串“”,0和“0”在php中都表示假。我想知道 php 在比较相等性时是否考虑到了这一点。

    $str = "";        
    echo ($str ==  "0") ? "yes" : "no"; // prints "no" (A)

    echo ($str ==   0)  ? "yes" : "no"; // prints "yes" (B)

A 行表明 php 正在比较 $str 和 "0",就好像它们都是字符串一样,忽略它们都可能意味着错误。但是 B 行是在比较他们的“错误”解释。

php首先检查两个值是否具有相同的类型,如果是,则假设相同的类型检查相等性;如果不是,它使用值的布尔含义(是否涉及类型转换?)

【问题讨论】:

  • 在第一种情况下,您正在比较两个字符串。所以自然“”与“0”不同。在第二个中,由于数据类型不同,发生了更多类型转换。使用三等号===,不用担心类型转换的歧义
  • 这可能会有所帮助:php.net/manual/en/types.comparisons.php
  • 只有当你转换为布尔值时,“0”字符串才会被解释为假,在其他情况下不会。
  • 如果你对更多有趣的 PHP 行为感兴趣,我建议all-time classic here

标签: php


【解决方案1】:

我了解到空字符串“”,0和“0”在php中都表示false。

这个说法是错误的。空字符串,0"0"转换为布尔 类型时为 false。否则它们分别是空字符串、整数零或带一个字符的字符串。

== 检查两个变量的值。如果它们的类型不同,则会发生一些强制转换并出现不可预测的(对于新手而言)结果。

=== 检查两个变量的值它们的类型。

无论如何,当您比较"0" == "" 时,PHP 解释器会比较两个不同的字符串。但是当您使用0 == "" 时,它首先将数字字符串更改为整数。空字符串等于 0。所以我们最终得到 0 == 0,这是真的。

注意:"8abc" 转换为整数后变为 8abc8 转换后变为 0

手册:
- Types casting (juggling)
- Types comparison

【讨论】:

  • 谢谢,这很有帮助
【解决方案2】:

PHP中有两个相等比较器

当类型相同时,它们的行为方式相同。

当类型不同时,这完全取决于:PHP 不会将两个值都转换为布尔值。这取决于两个操作数的类型,并且有一个表格可以知道 PHP 会做什么(见第二个链接)。

我建议阅读这个 stackoverflow 问题 How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

另外,比较的 PHP 手册 http://au.php.net/manual/en/language.operators.comparison.php

// double equal will cast the values as needed followin quite complex rules
0 == '0' // true, because PHP casted both sides to numbers

// triple equals returns true only when type and value match
0 === '0' // false

【讨论】:

    【解决方案3】:
    $str = "";        
    
    //Comparing two strings, no implicit type conversion happens. Since
    // "" is not equal "0", result is FALSE
    echo ($str ==  "0") ? "yes" : "no"; // prints "no" (A)
    
    //Comparing a STRING to an INT,implicit conversion happens to convert
    // the string "" to an INT. Since "" has no digits, it's evaluated
    // to 0. Hence, result of comparison is TRUE    
    echo ($str ==   0)  ? "yes" : "no"; // prints "yes" (B)
    

    使用“===”进行更准确的比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多