iguoji
V2EX  ›  PHP

PHP 中'false'等于 true?

  •  1
     
  •   iguoji · Jun 20, 2017 · 9789 views
    This topic created in 3432 days ago, the information mentioned may be changed or developed.

    例子:'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

    我该如何理解这个过程?

    Supplement 1  ·  Jun 20, 2017

    好吧,这题关闭了。

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

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

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

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


    所以是不是该这么理解?

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

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

    这个理解不能。。'0' 强转成 0 我能理解,'false' 转成 0 是什么鬼
    misaka19000
    misaka19000
    Jun 20, 2017 via Android
    17
    哈哈,PHP 的程序员再次验证了 PHP 是世界上最好的语言
    voocel
    voocel
    Jun 20, 2017 via Android
    18
    @UnisandK 那你觉得字符串'false'应该转成几
    troywinter
    troywinter
    Jun 20, 2017
    19
    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
    jasontse
    Jun 20, 2017 via iPad
    20
    'false' 转成 ASCII 不是 0 所以不等于 false
    clino
    clino
    Jun 20, 2017
    21
    如果 'false' 要等于 false,那 'False' 'FAlse' 'FALse' 'FALSe' 'FALSE' 这几个呢?
    caola
    caola
    Jun 20, 2017
    22
    只要是字符串类型的都是 true,不会转换成什么才比较。
    除非是 === 才会比较类型
    U7Q5tLAex2FI0o0g
    U7Q5tLAex2FI0o0g
    Jun 20, 2017
    23
    正式的业务代码中不会这么写的,这么写的人基本被打死了
    tabris17
    tabris17
    Jun 20, 2017
    24
    阿西吧~'false'是字符串啊
    troywinter
    troywinter
    Jun 20, 2017
    25
    另外我再指出一点错误,为什么它会 evaluate 成 0,你引用的那篇 php 官网的文档明确说明了:
    “该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0 (零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。”
    很明显这个你转化成 int 的这个字符串不是一个数字的字符串表示,所以必然返回的是 0。
    xzem
    xzem
    Jun 20, 2017❤️2
    26
    zjsxwc
    zjsxwc
    Jun 20, 2017
    27
    我前几天碰到这个坑

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

    所以感觉这里面并没有什么不对的(
    mylab
    mylab
    Jun 20, 2017
    36
    非空字符串==true 没问题啊
    bombless
    bombless
    Jun 20, 2017 via Android
    37
    @mylab 楼主的意思是字符串 0 是 falsy 的
    justplaymore
    justplaymore
    Jun 21, 2017
    38
    尽量用正确的方式去使用语言吧,隐式类型转换这种东西无论哪种语言,都是尽量避免去使用的,有这种特性不代表就应该去使用它,要衡量一下代价的。
    mingyun
    mingyun
    Jun 24, 2017
    39
    @rming 领教了
    2xShake
    2xShake
    Jul 3, 2017
    40
    话说 php 里什么情况下你会用到 == ‘ false ’ 来走判断
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3204 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 05:32 · PVG 13:32 · LAX 21:32 · JFK 00:32
    ♥ Do have faith in what you're doing.