PHP中的类型 - 杂耍和(严格)大于/小于比较

时间:2013-04-04 14:02:46

标签: php if-statement comparison logic ieee-754

PHP因其类型杂耍而闻名。我必须承认这让我很困惑,而且我很难在比较中找到基本的逻辑/基本内容。

例如:如果$a > $b为真且$b > $c为真,那么它是否意味着$a > $c 总是也是真的?

遵循基本逻辑,我会说但是我很困惑我在这方面并不真正信任PHP。也许某人可以举例说明情况并非如此?

我也想知道严格的小于和严格的大于运算符(因为它们的含义被严格描述,我过去只从等式比较中知道)如果左右操作数有任何区别与严格不相等的值交换:

# Precondition:
if ($a === $b) {
    throw new Exception(
       'Both are strictly equal - can not compare strictly for greater or smaller'
    );
}

($a > $b) !== ($b > $a)

对于大多数类型比较组合,这些greater / lesser comparison operators没有记录,因此在这种情况下阅读手册并不是真的有用。

3 个答案:

答案 0 :(得分:204)

PHP的比较运算符在几个方面偏离了计算机科学定义:

为了构成等价关系, ==必须是反身的,对称的和传递的:

  • PHP的==运算符没有反身,即$a == $a并非总是如此:

    var_dump(NAN == NAN); // bool(false)
    

    注意:任何涉及NAN的比较始终为false的事实并非特定于PHP。它由IEEE 754浮点运算标准(more info)强制执行。

  • PHP的==运算符对称,即$a == $b$b == $a始终相同。

  • PHP的==运算符不可传递,即来自$a == $b$b == $c 跟随{{1} }}:

    $a == $c

为了构成偏序 var_dump(true == "a"); // bool(true) var_dump("a" == 0); // bool(true) var_dump(true == 0); // bool(false) / <=必须具有反身性,反对称性和传递性:

  • PHP的>=运算符不反身,即<=并非总是如此(示例与$a <= $a相同)。

  • PHP的==运算符不反对称,即来自<=$a <= $b不遵循$b <= $a

    $a == $b
  • PHP的var_dump(NAN <= "foo"); // bool(true) var_dump("foo" <= NAN); // bool(true) var_dump(NAN == "foo"); // bool(false) 运算符不可传递,即来自<=$a <= $b不遵循$b <= $c(示例与$a <= $c)。

  • 额外:PHP的==运算符不是,即<=$a <= $b都可能为false:

    $b <= $a

为了构成严格的部分顺序 var_dump(new stdClass <= new DateTime); // bool(false) var_dump(new DateTime <= new stdClass); // bool(false) / <必须是反身的,不对称的和传递性的:

  • PHP的>运算符反身,即<永远不会成立。请注意,这是真的仅从PHP 5.4 。之前$a < $a评估为INF < INF

  • PHP的true运算符不对称,即来自<的{​​{1}}不跟$a < $b一样(示例与!($b < $a)相同反对称)。

  • PHP <=运算符不可传递,即来自<$a < $b不遵循$b < $c

    $a < $c
  • 额外:PHP的var_dump(-INF < 0); // bool(true) var_dump(0 < TRUE); // bool(true) var_dump(-INF < TRUE); // bool(false) 运算符不是三分法,即所有<$a < $b$b < $a都可能为false(示例与$a == $b不完全相同。

  • 额外:PHP的<=运算符可以是循环,即<$a < $b$b < $c:< / p>

    $c < $a

    注意:上面的示例抛出“类stdClass的对象无法转换为double”通知。

您可以在PHP Sadness 52 - Comparison operators上找到PHP的比较运算符的一些不错的图表。

作为最后一点,我想指出PHP 保证两个等式(与其他所有内容不同)。这两个总是成立,只是因为编译器将一个减少到另一个:

var_dump(INF < []);           // bool(true)
var_dump([] < new stdClass);  // bool(true)
var_dump(new stdClass < INF); // bool(true)

答案 1 :(得分:85)

PHP 中有没有 严格相同的比较运算符(>==<==)(至少PHP 5.6.14) ),但在检查大/小之前,有几种方法强制执行严格类型检查

  1. 使用if (gettype($a) === gettype($b))
  2. 检查两种变量类型
  3. 强制执行所需的类型转换,例如: if ((string)$a === (string)$b)
  4. 强制你需要的类型 - 例如。 if (($a . '') === ($b . ''))
  5. 请注意:

    • Floating point precision有限
    • INFNAN属于
    • 下的float类型
    • 某些 Infinity 等于其他 Infinity (自PHP 5.4起)
    • 科学记数法e始终为float类型,即使数字较小,也不会integer
    • 越过PHP_INT_MAX的整数会自动转换为float
    • 浮动系统的边界获得INF
    • 未定义的变量属于类型和值NULL
    • 0开头的整数从八进制转换为十进制(按惯例)
    • 将包含带前导0 的整数的字符串转换为整数将前导0

    一些异国情调的比较清单:

    Very strange:
         $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
      float(NAN)    float(-INF)     false   false   false   false   false   false
      float(NAN)      float(0)      false   false   false   false   false   false
      float(NAN)      float(1)      false   false   false   false   false   false
      float(NAN)     float(INF)     false   false   false   false   false   false
      float(NAN)     float(NAN)     false   false   false   false   false   false
      float(NAN)      int(-1)       false   false   false   false   false   false
      float(NAN)       int(0)       false   false   false   false   false   false
      float(NAN)       int(1)       false   false   false   false   false   false
    

    相同但不相同:

         $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
    
      NULL(NULL)      array()       false   false    true    true    true   false
      NULL(NULL)    bool(false)     false   false    true    true    true   false
      NULL(NULL)      float(0)      false   false    true    true    true   false
      NULL(NULL)       int(0)       false   false    true    true    true   false
      NULL(NULL)      str('')       false   false    true    true    true   false
       array()      bool(false)     false   false    true    true    true   false
     bool(false)      float(0)      false   false    true    true    true   false
     bool(false)       int(0)       false   false    true    true    true   false
       str('')      bool(false)     false   false    true    true    true   false
     bool(false)      str('0')      false   false    true    true    true   false
     float(-INF)     bool(true)     false   false    true    true    true   false
      bool(true)      float(1)      false   false    true    true    true   false
      float(INF)     bool(true)     false   false    true    true    true   false
      float(NAN)     bool(true)     false   false    true    true    true   false
      bool(true)      int(-1)       false   false    true    true    true   false
      bool(true)       int(1)       false   false    true    true    true   false
      bool(true)     str("\0")      false   false    true    true    true   false
      bool(true)      str('+')      false   false    true    true    true   false
      bool(true)      str('-')      false   false    true    true    true   false
      bool(true)     str('01')      false   false    true    true    true   false
      bool(true)      str('1')      false   false    true    true    true   false
      bool(true)    str('false')    false   false    true    true    true   false
     str('text')     bool(true)     false   false    true    true    true   false
     str('true')     bool(true)     false   false    true    true    true   false
        int(0)        float(0)      false   false    true    true    true   false
      str("\0")       float(0)      false   false    true    true    true   false
       str('')        float(0)      false   false    true    true    true   false
       str('+')       float(0)      false   false    true    true    true   false
       str('-')       float(0)      false   false    true    true    true   false
       str('0')       float(0)      false   false    true    true    true   false
     str('false')     float(0)      false   false    true    true    true   false
     str('text')      float(0)      false   false    true    true    true   false
     str('true')      float(0)      false   false    true    true    true   false
        int(1)        float(1)      false   false    true    true    true   false
       float(1)      str('01')      false   false    true    true    true   false
       float(1)       str('1')      false   false    true    true    true   false
      str("\0")        int(0)       false   false    true    true    true   false
       str('')         int(0)       false   false    true    true    true   false
       str('+')        int(0)       false   false    true    true    true   false
       str('-')        int(0)       false   false    true    true    true   false
        int(0)        str('0')      false   false    true    true    true   false
     str('false')      int(0)       false   false    true    true    true   false
     str('text')       int(0)       false   false    true    true    true   false
     str('true')       int(0)       false   false    true    true    true   false
        int(1)       str('01')      false   false    true    true    true   false
        int(1)        str('1')      false   false    true    true    true   false
       str('1')      str('01')      false   false    true    true    true   false
    

    同时降低和放大?

         $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
      float(NAN)     str("\0")       true    true    true    true   false   false
      float(NAN)      str('')        true    true    true    true   false   false
      float(NAN)      str('+')       true    true    true    true   false   false
      float(NAN)      str('-')       true    true    true    true   false   false
      float(NAN)      str('0')       true    true    true    true   false   false
      float(NAN)     str('01')       true    true    true    true   false   false
      float(NAN)      str('1')       true    true    true    true   false   false
      float(NAN)    str('false')     true    true    true    true   false   false
      float(NAN)    str('text')      true    true    true    true   false   false
      float(NAN)    str('true')      true    true    true    true   false   false
    

    相同且相同:

         $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
      NULL(NULL)     NULL(NULL)     false   false    true    true    true    true
     float(-INF)    float(-INF)     false   false    true    true    true    true
      float(INF)     float(INF)     false   false    true    true    true    true
    

    更低或更高:

         $a      VS.     $b         $a>$b   $a<$b   $a<=$b  $a>=$b  $a==$b  $a===$b
    
      NULL(NULL)     bool(true)     false    true    true   false   false   false
     float(-INF)     NULL(NULL)      true   false   false    true   false   false
      NULL(NULL)      float(1)      false    true    true   false   false   false
      float(INF)     NULL(NULL)      true   false   false    true   false   false
      float(NAN)     NULL(NULL)      true   false   false    true   false   false
      NULL(NULL)      int(-1)       false    true    true   false   false   false
      NULL(NULL)       int(1)       false    true    true   false   false   false
      NULL(NULL)     str("\0")      false    true    true   false   false   false
      NULL(NULL)      str('+')      false    true    true   false   false   false
      NULL(NULL)      str('-')      false    true    true   false   false   false
      NULL(NULL)      str('0')      false    true    true   false   false   false
      NULL(NULL)     str('01')      false    true    true   false   false   false
      NULL(NULL)      str('1')      false    true    true   false   false   false
      NULL(NULL)    str('false')    false    true    true   false   false   false
      NULL(NULL)    str('text')     false    true    true   false   false   false
      NULL(NULL)    str('true')     false    true    true   false   false   false
       array()       bool(true)     false    true    true   false   false   false
     float(-INF)      array()       false    true    true   false   false   false
       array()        float(0)       true   false   false    true   false   false
       array()        float(1)       true   false   false    true   false   false
      float(INF)      array()       false    true    true   false   false   false
      float(NAN)      array()       false    true    true   false   false   false
       array()        int(-1)        true   false   false    true   false   false
       array()         int(0)        true   false   false    true   false   false
       array()         int(1)        true   false   false    true   false   false
       array()       str("\0")       true   false   false    true   false   false
       str('')        array()       false    true    true   false   false   false
       array()        str('+')       true   false   false    true   false   false
       array()        str('-')       true   false   false    true   false   false
       array()        str('0')       true   false   false    true   false   false
       array()       str('01')       true   false   false    true   false   false
       array()        str('1')       true   false   false    true   false   false
       array()      str('false')     true   false   false    true   false   false
       array()      str('text')      true   false   false    true   false   false
       array()      str('true')      true   false   false    true   false   false
      bool(true)    bool(false)      true   false   false    true   false   false
     float(-INF)    bool(false)      true   false   false    true   false   false
       float(1)     bool(false)      true   false   false    true   false   false
      float(INF)    bool(false)      true   false   false    true   false   false
      float(NAN)    bool(false)      true   false   false    true   false   false
     bool(false)      int(-1)       false    true    true   false   false   false
        int(1)      bool(false)      true   false   false    true   false   false
     bool(false)     str("\0")      false    true    true   false   false   false
     bool(false)      str('+')      false    true    true   false   false   false
     bool(false)      str('-')      false    true    true   false   false   false
     bool(false)     str('01')      false    true    true   false   false   false
       str('1')     bool(false)      true   false   false    true   false   false
     bool(false)    str('false')    false    true    true   false   false   false
     str('text')    bool(false)      true   false   false    true   false   false
     str('true')    bool(false)      true   false   false    true   false   false
      bool(true)      float(0)       true   false   false    true   false   false
      bool(true)       int(0)        true   false   false    true   false   false
       str('')       bool(true)     false    true    true   false   false   false
      bool(true)      str('0')       true   false   false    true   false   false
     float(-INF)      float(0)      false    true    true   false   false   false
     float(-INF)      float(1)      false    true    true   false   false   false
      float(INF)    float(-INF)      true   false   false    true   false   false
     float(-INF)      int(-1)       false    true    true   false   false   false
     float(-INF)       int(0)       false    true    true   false   false   false
     float(-INF)       int(1)       false    true    true   false   false   false
     float(-INF)     str("\0")      false    true    true   false   false   false
     float(-INF)      str('')       false    true    true   false   false   false
     float(-INF)      str('+')      false    true    true   false   false   false
     float(-INF)      str('-')      false    true    true   false   false   false
     float(-INF)      str('0')      false    true    true   false   false   false
     float(-INF)     str('01')      false    true    true   false   false   false
     float(-INF)      str('1')      false    true    true   false   false   false
     float(-INF)    str('false')    false    true    true   false   false   false
     float(-INF)    str('text')     false    true    true   false   false   false
     float(-INF)    str('true')     false    true    true   false   false   false
       float(1)       float(0)       true   false   false    true   false   false
      float(INF)      float(0)       true   false   false    true   false   false
       float(0)       int(-1)        true   false   false    true   false   false
        int(1)        float(0)       true   false   false    true   false   false
       float(0)      str('01')      false    true    true   false   false   false
       str('1')       float(0)       true   false   false    true   false   false
      float(INF)      float(1)       true   false   false    true   false   false
       float(1)       int(-1)        true   false   false    true   false   false
       float(1)        int(0)        true   false   false    true   false   false
       float(1)      str("\0")       true   false   false    true   false   false
       str('')        float(1)      false    true    true   false   false   false
       float(1)       str('+')       true   false   false    true   false   false
       float(1)       str('-')       true   false   false    true   false   false
       float(1)       str('0')       true   false   false    true   false   false
       float(1)     str('false')     true   false   false    true   false   false
     str('text')      float(1)      false    true    true   false   false   false
     str('true')      float(1)      false    true    true   false   false   false
      float(INF)      int(-1)        true   false   false    true   false   false
      float(INF)       int(0)        true   false   false    true   false   false
      float(INF)       int(1)        true   false   false    true   false   false
      float(INF)     str("\0")       true   false   false    true   false   false
      float(INF)      str('')        true   false   false    true   false   false
      float(INF)      str('+')       true   false   false    true   false   false
      float(INF)      str('-')       true   false   false    true   false   false
      float(INF)      str('0')       true   false   false    true   false   false
      float(INF)     str('01')       true   false   false    true   false   false
      float(INF)      str('1')       true   false   false    true   false   false
      float(INF)    str('false')     true   false   false    true   false   false
      float(INF)    str('text')      true   false   false    true   false   false
      float(INF)    str('true')      true   false   false    true   false   false
        int(0)        int(-1)        true   false   false    true   false   false
        int(1)        int(-1)        true   false   false    true   false   false
      str("\0")       int(-1)        true   false   false    true   false   false
       str('')        int(-1)        true   false   false    true   false   false
       str('+')       int(-1)        true   false   false    true   false   false
       str('-')       int(-1)        true   false   false    true   false   false
       str('0')       int(-1)        true   false   false    true   false   false
       int(-1)       str('01')      false    true    true   false   false   false
       str('1')       int(-1)        true   false   false    true   false   false
     str('false')     int(-1)        true   false   false    true   false   false
     str('text')      int(-1)        true   false   false    true   false   false
     str('true')      int(-1)        true   false   false    true   false   false
        int(1)         int(0)        true   false   false    true   false   false
        int(0)       str('01')      false    true    true   false   false   false
       str('1')        int(0)        true   false   false    true   false   false
        int(1)       str("\0")       true   false   false    true   false   false
       str('')         int(1)       false    true    true   false   false   false
        int(1)        str('+')       true   false   false    true   false   false
        int(1)        str('-')       true   false   false    true   false   false
        int(1)        str('0')       true   false   false    true   false   false
        int(1)      str('false')     true   false   false    true   false   false
     str('text')       int(1)       false    true    true   false   false   false
     str('true')       int(1)       false    true    true   false   false   false
       str('')       str("\0")      false    true    true   false   false   false
       str('+')      str("\0")       true   false   false    true   false   false
       str('-')      str("\0")       true   false   false    true   false   false
      str("\0")       str('0')      false    true    true   false   false   false
      str("\0")      str('01')      false    true    true   false   false   false
       str('1')      str("\0")       true   false   false    true   false   false
     str('false')    str("\0")       true   false   false    true   false   false
     str('text')     str("\0")       true   false   false    true   false   false
     str('true')     str("\0")       true   false   false    true   false   false
       str('')        str('+')      false    true    true   false   false   false
       str('')        str('-')      false    true    true   false   false   false
       str('')        str('0')      false    true    true   false   false   false
       str('')       str('01')      false    true    true   false   false   false
       str('')        str('1')      false    true    true   false   false   false
       str('')      str('false')    false    true    true   false   false   false
       str('')      str('text')     false    true    true   false   false   false
       str('')      str('true')     false    true    true   false   false   false
       str('-')       str('+')       true   false   false    true   false   false
       str('+')       str('0')      false    true    true   false   false   false
       str('+')      str('01')      false    true    true   false   false   false
       str('1')       str('+')       true   false   false    true   false   false
     str('false')     str('+')       true   false   false    true   false   false
     str('text')      str('+')       true   false   false    true   false   false
     str('true')      str('+')       true   false   false    true   false   false
       str('-')       str('0')      false    true    true   false   false   false
       str('-')      str('01')      false    true    true   false   false   false
       str('1')       str('-')       true   false   false    true   false   false
     str('false')     str('-')       true   false   false    true   false   false
     str('text')      str('-')       true   false   false    true   false   false
     str('true')      str('-')       true   false   false    true   false   false
       str('0')      str('01')      false    true    true   false   false   false
       str('1')       str('0')       true   false   false    true   false   false
     str('false')     str('0')       true   false   false    true   false   false
     str('text')      str('0')       true   false   false    true   false   false
     str('true')      str('0')       true   false   false    true   false   false
     str('false')    str('01')       true   false   false    true   false   false
     str('text')     str('01')       true   false   false    true   false   false
     str('true')     str('01')       true   false   false    true   false   false
       str('1')     str('false')    false    true    true   false   false   false
     str('text')      str('1')       true   false   false    true   false   false
     str('true')      str('1')       true   false   false    true   false   false
     str('text')    str('false')     true   false   false    true   false   false
     str('true')    str('false')     true   false   false    true   false   false
     str('true')    str('text')      true   false   false    true   false   false
    

    $a > $b > $c难题:$a不超过$c

    A<C   : float(NAN)  >  str('a')   >   str('')
    A<C   : float(NAN)  >  str('a')   >   str('1')
    A<C   : float(NAN)  >  str('a')   >   str('A')
    A<C   : float(NAN)  >  str('a')   >   str('0')
    A<C   : float(NAN)  >  str('1')   >   str('')
    A<C   : float(NAN)  >  str('1')   >   str('0')
    A<C   : float(NAN)  >  str('A')   >   str('')
    A<C   : float(NAN)  >  str('A')   >   str('1')
    A<C   : float(NAN)  >  str('A')   >   str('0')
    A<C   : float(NAN)  >  str('0')   >   str('')
    A<C   :   str('')   > float(NAN)  >   str('a')
    A<C   :   str('')   > float(NAN)  >   str('1')
    A<C   :   str('')   > float(NAN)  >   str('A')
    A<C   :   str('')   > float(NAN)  >   str('0')
    A<C   :  str('a')   >   str('')   >  float(NAN)
    A<C   :  str('a')   >  str('1')   >  float(NAN)
    A<C   :  str('a')   >  str('A')   >  float(NAN)
    A<C   :  str('a')   >  str('0')   >  float(NAN)
    A<C   :  str('0')   >   str('')   >  float(NAN)
    A==C  : bool(true)  >   str('')   >  float(NAN)
    A==C  : bool(true)  >   str('')   > float(-INF)
    A==C  : bool(true)  >   str('')   >   int(-1)
    A==C  : bool(true)  >   str('')   >  float(-1)
    A==C  : bool(true)  >   array()   >  float(NAN)
    A==C  : bool(true)  >   array()   >  float(INF)
    A==C  : bool(true)  >   array()   > float(-INF)
    A==C  : bool(true)  >   array()   >   str('a')
    A==C  : bool(true)  >   array()   >    int(1)
    A==C  : bool(true)  >   array()   >   float(1)
    A==C  : bool(true)  >   array()   >   str('1')
    A==C  : bool(true)  >   array()   >   str('A')
    A==C  : bool(true)  >   array()   >   int(-1)
    A==C  : bool(true)  >   array()   >  float(-1)
    A==C  : bool(true)  >   int(0)    > float(-INF)
    A==C  : bool(true)  >   int(0)    >   int(-1)
    A==C  : bool(true)  >   int(0)    >  float(-1)
    A==C  : bool(true)  >  str('0')   >  float(NAN)
    A==C  : bool(true)  >  str('0')   > float(-INF)
    A==C  : bool(true)  >  str('0')   >   int(-1)
    A==C  : bool(true)  >  str('0')   >  float(-1)
    A==C  : bool(true)  >  float(0)   > float(-INF)
    A==C  : bool(true)  >  float(0)   >   int(-1)
    A==C  : bool(true)  >  float(0)   >  float(-1)
    A==C  :   int(1)    >  str('a')   >   str('1')
    A==C  :   int(1)    >  str('A')   >   str('1')
    A==C  :  float(1)   >  str('a')   >   str('1')
    A==C  :  float(1)   >  str('A')   >   str('1')
    A==C  :  str('a')   >  str('1')   >    int(0)
    A==C  :  str('a')   >  str('1')   >   float(0)
    A==C  :   str('')   > float(-INF) >  NULL(NULL)
    A==C  :   str('')   > float(-INF) > bool(false)
    A==C  :   str('')   >   int(-1)   >  NULL(NULL)
    A==C  :   str('')   >   int(-1)   > bool(false)
    A==C  :   str('')   >  float(-1)  >  NULL(NULL)
    A==C  :   str('')   >  float(-1)  > bool(false)
    A==C  :   array()   > float(NAN)  >  NULL(NULL)
    A==C  :   array()   > float(NAN)  > bool(false)
    A==C  :   array()   > float(INF)  >  NULL(NULL)
    A==C  :   array()   > float(INF)  > bool(false)
    A==C  :   array()   > float(-INF) >  NULL(NULL)
    A==C  :   array()   > float(-INF) > bool(false)
    A==C  :   array()   >  str('a')   >  NULL(NULL)
    A==C  :   array()   >  str('a')   > bool(false)
    A==C  :   array()   >   int(1)    >  NULL(NULL)
    A==C  :   array()   >   int(1)    > bool(false)
    A==C  :   array()   >  float(1)   >  NULL(NULL)
    A==C  :   array()   >  float(1)   > bool(false)
    A==C  :   array()   >  str('1')   >  NULL(NULL)
    A==C  :   array()   >  str('1')   > bool(false)
    A==C  :   array()   >  str('A')   >  NULL(NULL)
    A==C  :   array()   >  str('A')   > bool(false)
    A==C  :   array()   >  str('0')   >  NULL(NULL)
    A==C  :   array()   >   int(-1)   >  NULL(NULL)
    A==C  :   array()   >   int(-1)   > bool(false)
    A==C  :   array()   >  float(-1)  >  NULL(NULL)
    A==C  :   array()   >  float(-1)  > bool(false)
    A==C  :   str('')   > float(NAN)  > bool(false)
    A==C  :   str('')   > float(NAN)  >  NULL(NULL)
    A==C  :  str('A')   >  str('1')   >    int(0)
    A==C  :  str('A')   >  str('1')   >   float(0)
    A==C  :   int(0)    > float(-INF) >  NULL(NULL)
    A==C  :   int(0)    > float(-INF) > bool(false)
    A==C  :   int(0)    >   int(-1)   >  NULL(NULL)
    A==C  :   int(0)    >   int(-1)   > bool(false)
    A==C  :   int(0)    >  float(-1)  >  NULL(NULL)
    A==C  :   int(0)    >  float(-1)  > bool(false)
    A==C  :  str('0')   > float(NAN)  > bool(false)
    A==C  :  str('0')   > float(-INF) > bool(false)
    A==C  :  str('0')   >   int(-1)   > bool(false)
    A==C  :  str('0')   >  float(-1)  > bool(false)
    A==C  :  float(0)   > float(-INF) >  NULL(NULL)
    A==C  :  float(0)   > float(-INF) > bool(false)
    A==C  :  float(0)   >   int(-1)   >  NULL(NULL)
    A==C  :  float(0)   >   int(-1)   > bool(false)
    A==C  :  float(0)   >  float(-1)  >  NULL(NULL)
    A==C  :  float(0)   >  float(-1)  > bool(false)
    A===C :  str('0')   > float(NAN)  >   str('0')
    A===C :   str('')   > float(NAN)  >   str('')
    A===C :  str('a')   > float(NAN)  >   str('a')
    A===C :  str('1')   > float(NAN)  >   str('1')
    A===C :  str('A')   > float(NAN)  >   str('A')
    

    有趣的字符串比较:'女王'>'国王'>'杰克'>'王牌'

    同时查看PHP type comparison tables覆盖对:

    • isset()is_null()
    • if()empty()
    • 布尔=====

    检查实时的PHP版本之间的差异。 http://3v4l.org/MAfDu

答案 2 :(得分:22)

在纠正问题的第二部分之后,我将答案留给其他人。我只想对您问题的第一部分给出最令人惊讶的答案,即是否有<>运算符不具有不及物性的示例。在这里。

这些都是true

"10" < "1a"
"1a" < "2"
"10" > "2"

如果<是可传递的($a < $b$b < $c$a < $c),最后一行将是

"10" < "2"

但PHP尝试善待(?!)并尽可能将字符串解释为数字。

事实证明,由于上述不及物,sort()可以根据输入顺序将相同的元素排序为不同的顺序,即使没有两个元素== (并且没有元素是NAN)。我在comment to sort()中指出了这一点,其实质是:

sort(array("10", "1a", "2" )) => array("10", "1a", "2" )
sort(array("10", "2",  "1a")) => array("1a", "2",  "10")
sort(array("1a", "10", "2" )) => array("2",  "10", "1a")
sort(array("1a", "2",  "10")) => array("1a", "2",  "10")
sort(array("2",  "10", "1a")) => array("2",  "10", "1a")
sort(array("2",  "1a", "10")) => array("10", "1a", "2" )
相关问题