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

吐槽一下 PHP 的官方实现

  •  
  •   mantianyu · 2014-02-18 16:42:11 +08:00 · 3971 次点击
    这是一个创建于 3930 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http://www.php.net/manual/en/language.types.boolean.php

    When converting to boolean, the following values are considered FALSE:

    the boolean FALSE itself
    the integer 0 (zero)
    the float 0.0 (zero)
    the empty string, and the string "0"
    an array with zero elements
    an object with zero member variables (PHP 4 only)
    the special type NULL (including unset variables)
    SimpleXML objects created from empty tags

    为什么强转 boolean 时 "0" 被认为是 false, 既然如此, 那 "false" 怎么不认为是 false?
    17 条回复    1970-01-01 08:00:00 +08:00
    vibbow
        1
    vibbow  
       2014-02-18 16:48:29 +08:00
    因为 "false" 是不为空的string
    GordianZ
        2
    GordianZ  
    MOD
       2014-02-18 16:54:19 +08:00
    如果 "false" 算 false, 那 "False"/"FaLsE"/"假" 呢?
    joyqi
        3
    joyqi  
       2014-02-18 17:01:08 +08:00
    这有啥好吐槽的
    yelite
        4
    yelite  
       2014-02-18 17:01:56 +08:00   ❤️ 1
    我猜是因为url参数和post的表单解析出来直接是string,为了方便php就有了这种设计
    mantianyu
        5
    mantianyu  
    OP
       2014-02-18 17:02:11 +08:00
    @GordianZ 我就是这个意思, 如果 "false", "False", "FALSE", "NO", "OFF" 都不算 false, 为什么 "0" 是例外?
    mantianyu
        6
    mantianyu  
    OP
       2014-02-18 17:03:22 +08:00
    @joyqi 跟国风接轨嘛
    vibbow
        7
    vibbow  
       2014-02-18 17:04:04 +08:00
    @mantianyu 因为 (int)0 和 (string)0 是无痛转换的?
    hanf
        8
    hanf  
       2014-02-18 17:08:06 +08:00
    php蛋疼又不是两三天了
    infong
        9
    infong  
       2014-02-18 17:16:23 +08:00   ❤️ 1
    因为 "0" == 0 而且 0 == false
    所以 "0" == false
    liruqi
        10
    liruqi  
       2014-02-18 17:18:36 +08:00
    你也可以坚持用 === 嘛。
    liuyao729
        11
    liuyao729  
       2014-02-18 17:39:49 +08:00
    字符串除了 0 就没有为假的了
    likexian
        12
    likexian  
       2014-02-18 17:44:45 +08:00
    如果非要那么纠结,就忘记php有==,只用===
    jakwings
        13
    jakwings  
       2014-02-18 23:35:59 +08:00
    @infong 不应该用 == 来作传递性说明的…… == 比较比直接转化为布尔值麻烦多了。
    var_dump("0.0" == 0.0); //=> bool(true)
    var_dump((bool)"0.0"); //=> bool(true)
    var_dump((bool)0.0); //=> bool(false)

    我觉得 yelite 说得比较有道理。
    heirenhua
        14
    heirenhua  
       2014-02-19 12:05:54 +08:00   ❤️ 1
    @mantianyu 你可以看一下PHP中字符串和数字的转换规则。"0"被认为false,只是因为被转换了。
    nina
        15
    nina  
       2014-02-19 15:50:52 +08:00
    技术讨论帖 发个招聘小纸条 小交易招资深php开发一名,至少3年实打实的项目经验。PHP高级开发: 15-20k
    岗位职责:
    网站服务端开发,包括后端逻辑以及数据库,缓存等方面。
    岗位要求:
    1、三年以上PHP开发经验,有高并发访问的 Web 应用开发经验;
    2、具备大型开发项目的规划、方案设计以及重构经验的经验;
    3、对 PHP技术及整个解决方案有深刻的理解及熟练的应用,并且精通架构和设计模式,并在此基础上设计产品框架;
    4、精通网络和服务器优化、缓存、分布式存储技术,拥有异构系统开发部署和优化经验;
    5、精通数据库如 Mysql 等的开发 ,熟悉linux shell 脚本的编写,对数据库优化有较深见解。对 memcached 及 NOSql、REDIS 有一定了解;
    6,精通LNMP或LAMP架构。
    7、对计算机系统、网络和安全、应用系统架构等有全面的认识,并有实践基础;
    qq281079797
    lygmqkl
        16
    lygmqkl  
       2014-02-19 19:33:12 +08:00
    这个应该算自己偷懒的表现,如果你使用的是你自己生成的变量,那么不会有这个疑惑,如果是input进来的自然要做变脸转换,否则php代码的质量如何保证?
    picasso250
        17
    picasso250  
       2014-02-20 09:40:47 +08:00
    ?is_foo=0
    ?is_foo=1

    var_dump($_GET('is_foo'));
    var_dump((bool)$_GET('is_foo'));
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1103 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:51 · PVG 02:51 · LAX 10:51 · JFK 13:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.