V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Part
V2EX  ›  PHP

== 比较 array() 、0 、"" 、 false、null

  •  
  •   Part · 2014-02-17 16:39:57 +08:00 · 2901 次点击
    这是一个创建于 3693 天前的主题,其中的信息可能已经有所发展或是发生改变。
    array() == "" false
    array() == 0 false
    array() == false true
    array() == null true

    "" == 0 true
    "" == false true
    0 == null true
    "" == null true

    以上这些结果如何才能够解释得通?
    12 条回复    1970-01-01 08:00:00 +08:00
    Part
        1
    Part  
    OP
       2014-02-17 17:01:38 +08:00
    By the way,如何找出某函数在PHP中的实现,git源码(https://github.com/php/php-src)中,无从下手。
    picasso250
        2
    picasso250  
       2014-02-17 17:07:34 +08:00   ❤️ 3
    http://www.php.net/manual/en/language.operators.comparison.php

    请注意阅读文档中的转换表(规则1至规则7)

    规则0: 如果两者中包含数字或者数字式的字符串,会变成数字。(数字亲和原则)所以,257就是正确的

    1. array() == "" false // array和任意东西比较 array较大 规则7
    2. array() == 0 false // array和任意东西比较 array较大 规则7
    3. array() == false true // bool和任意东西比较,转换为bool 规则2
    4. array() == null true // null和任意东西比较,转换为bool 规则2

    5. "" == 0 true // 规则0
    6. "" == false true // 规则2
    7. 0 == null true // 规则2
    8. "" == null true // null转换为"" 规则1

    请再次阅读文档。

    ps
    我觉得这问题很无聊(更无聊的是我竟然回答你……)
    shiny
        3
    shiny  
       2014-02-17 17:09:45 +08:00   ❤️ 1
    研究它为什么这么转换我觉得没什么意义。
    知道这个的存在,谨慎使用松散比较就可以了。
    picasso250
        4
    picasso250  
       2014-02-17 17:11:30 +08:00
    更正 规则0:如果两者都是字符串/数字,会转换成数字。(数字亲和原则)
    picasso250
        5
    picasso250  
       2014-02-17 17:15:47 +08:00
    @Part 请将源码下载下来,在 *.c 中搜函数名!

    !!!
    Part
        6
    Part  
    OP
       2014-02-17 17:24:42 +08:00
    jakwings
        7
    jakwings  
       2014-02-17 17:40:33 +08:00
    我的观点和 shiny 的差不多。这种比较没什么大的意义,假如你编程语言接触得更多了,就越是会有这种感觉,平时应该用 === 而不是 == ,不确定是什么类型时,最好先判断类型。
    FrankFang128
        8
    FrankFang128  
       2014-02-17 18:28:41 +08:00
    避免这些比较
    Mutoo
        9
    Mutoo  
       2014-02-17 21:06:03 +08:00
    最近看 《maintainable javascript》 里面有提及在js中类似的情况,是由js的隐似类型转换决定的。

    两个类型不一致的对象比较时,会将较高阶的一方转换成较低阶的,再进行比较,例如隐式调用 valueOf() 或者 toString()

    php与javascript有许多的相似之处,可以这样理解

    array()与""作比较,转换成 String 后是 "Array",结果当然不相等
    ""与false比较,""转换成bool后即false,所以相等
    picasso250
        10
    picasso250  
       2014-02-18 13:19:59 +08:00
    array()与""作比较,转换成 String 后是 "Array",结果当然不相等 // 错误的原理

    @Mutoo 请看文档


    反正是能用 === 的不要用 == 就对了。
    tonitech
        11
    tonitech  
       2014-02-20 21:48:52 +08:00
    楼主为什么要比较这些啊?
    @picasso250 感谢你的分享!
    Part
        12
    Part  
    OP
       2014-02-25 08:50:22 +08:00
    @tonitech 被一个“特别思维的”家伙问倒过...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3791 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:21 · PVG 18:21 · LAX 03:21 · JFK 06:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.