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

PHP 中'false'等于 true?

  •  1
     
  •   iguoji · 2017-06-20 11:27:29 +08:00 · 8414 次点击
    这是一个创建于 2719 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例子:'0' == false

    PHP 官方文档中有这么描述

    如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。

    连接: http://www.php.net/manual/zh/language.operators.comparison.php

    所以,'0' == false,我能理解

    那么,'false' == true,我是不是应该理解为,先将'false'转成整数型

    而将字符串'false'转成数字后,结果为0,为什么等于true呢?

    参考: http://php.net/manual/zh/language.types.string.php#language.types.string.conversion

    我该如何理解这个过程?

    第 1 条附言  ·  2017-06-20 14:18:11 +08:00

    好吧,这题关闭了。

    最终理解过程,当字符串和布尔值进行比较时,会先将字符串转换成布尔值。

    而字符串中除了'0'等于false之外,其他字符串都等于true

    即便是'0.0'、'-0'也都等于true

    40 条回复    2017-07-03 13:50:44 +08:00
    jihaiming
        1
    jihaiming  
       2017-06-20 11:32:29 +08:00
    这里"false" 是字符串了
    Scholer
        2
    Scholer  
       2017-06-20 11:33:12 +08:00
    'false' == true 既不是数字和字符串也不是涉及数字内容的字符串,所以这就是字符串和 bool 的比较,相当于 'a' == true
    shooyaaa
        3
    shooyaaa  
       2017-06-20 11:33:40 +08:00
    官方文档里面说的规则仅限于字符串和数字比较的时候,并没有说和 bool 比较的时候也会转换为数字
    harborM
        4
    harborM  
       2017-06-20 11:34:02 +08:00
    ‘ false ’是字符串,false 是布尔型
    Light3
        5
    Light3  
       2017-06-20 11:36:46 +08:00
    'false' 不是 false 你找个编辑器打一下啊 看看色都不一样 你就懂了 一个字符串 一个布尔
    beyoung
        6
    beyoung  
       2017-06-20 11:40:31 +08:00 via iPhone
    非空字符串是 true 没毛病
    iguoji
        7
    iguoji  
    OP
       2017-06-20 11:41:58 +08:00
    @jihaiming
    @Scholer
    @shooyaaa
    @harborM
    @Light3
    @beyoung


    所以是不是该这么理解?

    当 纯数字组成的字符串 和 布尔型比较时, 会将该字符串先转成数字后再判断

    当 不全部是或没有数字的字符串 和 布尔型比较时, 该字符串就不会转成数字
    2ME
        8
    2ME  
       2017-06-20 11:45:00 +08:00
    非要说理解的话 这就是 php 的规则 ‘ false ’ 就是一个普通的字符串 普通字符串和 bool 比较并不会类型转换
    你也可以发布个自己的语言 规则: ‘ false ’被定义为一个特殊的字符串 会被转换成 bool 进行比较
    话说之前有遇到过类似的面试题
    Tokin
        9
    Tokin  
       2017-06-20 12:44:40 +08:00
    @jihaiming
    @Scholer
    @shooyaaa
    @harborM
    @Light3
    @beyoung
    我觉得楼主想表达的是'0'和'false'都是字符串,为什么'false'==true,'0'==false
    Tokin
        10
    Tokin  
       2017-06-20 12:49:42 +08:00
    我试了一下,数字里面只有'0'是 false,'00'或者其它数字都是 true。
    应该是 php 的规则限制了'0'
    levn
        11
    levn  
       2017-06-20 12:55:28 +08:00
    不是转成数字而是转成布尔吧
    rming
        12
    rming  
       2017-06-20 13:09:56 +08:00
    changwei
        13
    changwei  
       2017-06-20 13:13:03 +08:00 via Android
    php,js,这种弱类型还自动转换的编程语言,最容易考倒人,楼下来人,快给楼主奉上九九真值表(ಠ .̫.̫ ಠ)
    bumz
        14
    bumz  
       2017-06-20 13:13:53 +08:00
    == 这个运算符就是用来坑人的
    qiayue
        15
    qiayue  
       2017-06-20 13:16:28 +08:00
    楼主是一个七年全栈工程师 /t/339892
    UnisandK
        16
    UnisandK  
       2017-06-20 13:18:01 +08:00
    而将字符串'false'转成数字后,结果为 0

    这个理解不能。。'0' 强转成 0 我能理解,'false' 转成 0 是什么鬼
    misaka19000
        17
    misaka19000  
       2017-06-20 13:21:00 +08:00 via Android
    哈哈,PHP 的程序员再次验证了 PHP 是世界上最好的语言
    voocel
        18
    voocel  
       2017-06-20 13:31:02 +08:00 via Android
    @UnisandK 那你觉得字符串'false'应该转成几
    troywinter
        19
    troywinter  
       2017-06-20 13:32:07 +08:00
    https://www.designcise.com/web/tutorial/how-to-evaluate-string-false-in-php
    "Anything other than these values will always return true when evaluated. It may be useful to mention here that casting to boolean type, or using the settype won't do the trick here because "false" (i.e. string false) is not type converted to boolean false. In fact it evaluates to true which is actually the correct interpretation. This is simply due to the fact that it is a non-empty string, that by definition is truthy. However, this may be problematic because a boolean false value transported to a PHP script would be received as a string "false" — not what one might expect in some cases."
    jasontse
        20
    jasontse  
       2017-06-20 13:35:03 +08:00 via iPad
    'false' 转成 ASCII 不是 0 所以不等于 false
    clino
        21
    clino  
       2017-06-20 13:36:59 +08:00
    如果 'false' 要等于 false,那 'False' 'FAlse' 'FALse' 'FALSe' 'FALSE' 这几个呢?
    caola
        22
    caola  
       2017-06-20 13:38:32 +08:00
    只要是字符串类型的都是 true,不会转换成什么才比较。
    除非是 === 才会比较类型
    littleylv
        23
    littleylv  
       2017-06-20 13:39:56 +08:00
    正式的业务代码中不会这么写的,这么写的人基本被打死了
    tabris17
        24
    tabris17  
       2017-06-20 13:40:01 +08:00
    阿西吧~'false'是字符串啊
    troywinter
        25
    troywinter  
       2017-06-20 13:41:17 +08:00
    另外我再指出一点错误,为什么它会 evaluate 成 0,你引用的那篇 php 官网的文档明确说明了:
    “该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0 (零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。”
    很明显这个你转化成 int 的这个字符串不是一个数字的字符串表示,所以必然返回的是 0。
    xzem
        26
    xzem  
       2017-06-20 13:44:51 +08:00   ❤️ 2
    zjsxwc
        27
    zjsxwc  
       2017-06-20 13:49:47 +08:00
    我前几天碰到这个坑

    <?php
    $a= 0;
    var_dump($a == "imageUrl");//输出 bool(true)
    wolfan
        28
    wolfan  
       2017-06-20 13:50:41 +08:00 via Android
    引起来了不是字串么?,既然字串里有东西为什么不是真?
    icedx
        29
    icedx  
       2017-06-20 13:53:04 +08:00 via Android
    很多语言都是'false'等于 true
    w516322644
        30
    w516322644  
       2017-06-20 15:26:16 +08:00
    @zjsxwc 这个会把后面的字符串强制转换成 int。
    demerol
        31
    demerol  
       2017-06-20 15:34:29 +08:00 via Android
    if err 这种用法在弱类型的 js 里很常用,只有是非空非 false 就是 true
    zi
        32
    zi  
       2017-06-20 17:13:31 +08:00
    @zjsxwc #27 var_dump(0 == "imageUrl", 0 == false, false == "imageUrl", intval("imageUrl"), boolval("imageUrl"));
    skylancer
        33
    skylancer  
       2017-06-20 17:31:45 +08:00
    请注意安全性问题哟
    goodan
        34
    goodan  
       2017-06-20 17:35:38 +08:00
    虽然不会编程,但看标题就猜到是字符串。
    bombless
        35
    bombless  
       2017-06-20 17:35:40 +08:00
    false 转为字符串的时候是''
    0 转为字符串的时候是'0'

    所以感觉这里面并没有什么不对的(
    mylab
        36
    mylab  
       2017-06-20 18:34:30 +08:00
    非空字符串==true 没问题啊
    bombless
        37
    bombless  
       2017-06-20 20:09:49 +08:00 via Android
    @mylab 楼主的意思是字符串 0 是 falsy 的
    justplaymore
        38
    justplaymore  
       2017-06-21 01:11:56 +08:00
    尽量用正确的方式去使用语言吧,隐式类型转换这种东西无论哪种语言,都是尽量避免去使用的,有这种特性不代表就应该去使用它,要衡量一下代价的。
    mingyun
        39
    mingyun  
       2017-06-24 09:49:30 +08:00
    @rming 领教了
    2xShake
        40
    2xShake  
       2017-07-03 13:50:44 +08:00
    话说 php 里什么情况下你会用到 == ‘ false ’ 来走判断
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5444 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 07:27 · PVG 15:27 · LAX 23:27 · JFK 02:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.