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

关于 PHP 的一个问题, 有人能解释一下吗?

  •  
  •   samael · 2015-07-16 12:12:53 +08:00 · 2563 次点击
    这是一个创建于 3448 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目需要, 刚学用PHP, 发现了个奇怪的问题, 有人能解释一下为什么吗?

    $str = "aaaa";
    if($str == 0) {
        echo ('What the fuck'); // 为什么在这里?
    } else {
        echo ('I wanna it');
    }
    
    第 1 条附言  ·  2015-07-16 12:50:59 +08:00
    结贴

    lua 里字符转数字 为 nil nil == 0 是false
    js 里字符转数字 为 NaN NaN == 0 是false
    python 里字符串与数字对比没有隐式转换
    13 条回复    2015-07-17 11:45:33 +08:00
    b821025551b
        1
    b821025551b  
       2015-07-16 12:16:37 +08:00
    字符“aaaa”对应类型为false;
    0对应类型为false;
    false===false
    wy315700
        2
    wy315700  
       2015-07-16 12:18:33 +08:00
    ==不检查类型
    ===会检查类型
    lincanbin
        3
    lincanbin  
       2015-07-16 12:20:31 +08:00
    弱类型语言的隐式转换,string和int不能直接比较,所以实际上发生的是:
    $str = "aaaa";
    if(intval($str) == 0) {
    echo ('What the fuck'); // 为什么在这里?
    } else {
    echo ('I wanna it');
    }
    实际上发生了隐式转换,如果不需要这个特性,你可以这么写:
    $str = "aaaa";
    if($str === 0) {
    echo ('What the fuck'); // 为什么在这里?
    } else {
    echo ('I wanna it');
    }
    samael
        4
    samael  
    OP
       2015-07-16 12:37:54 +08:00
    lua javascript python 这样的弱类型语言在对比 str == 0 全返回的是false
    我是想知道php为什么会这样处理
    arzusyume
        5
    arzusyume  
       2015-07-16 12:42:53 +08:00
    js里"aaaa"转Number是NaN,
    php里intval的结果就是0

    用 == 不是好习惯, 应该明确类型后使用 ===
    xdazz
        6
    xdazz  
       2015-07-16 13:14:36 +08:00
    samael
        7
    samael  
    OP
       2015-07-16 13:18:53 +08:00
    @xdazz 多谢, 这才是我想要的
    iyaozhen
        8
    iyaozhen  
       2015-07-16 13:43:12 +08:00 via Android
    比较的时候会有类型转换,字符串转化成int时会看字符串的第一个字符,如果第一个不是数字的话就变成0了。

    你改成"1aaa" 就不相等了
    lijinma
        9
    lijinma  
       2015-07-16 13:48:34 +08:00
    Psy Shell v0.3.3 (PHP 5.5.13 — cli) by Justin Hileman
    >>> 'aaaa' == false
    => false
    >>> 'aaaa' == 0
    => true
    >>> false == 0
    => true
    123123
        10
    123123  
       2015-07-16 15:58:22 +08:00
    1L 这理论从哪个语言来的
    realpg
        11
    realpg  
       2015-07-16 20:17:53 +08:00
    PHP的==跟判断机制变量类型有关

    当一个字符串去跟数字==的时候,首先会把字符串转成数字,等效隐式对字符串使用intval()
    然后你去查intval的处理特性,是从左往右找可转换为int的串,遇到不可转换的非法字符后忽略后面的所有字符。

    而且intval保证返回的是一个int类型的数字,所以异常的输入(比如从头开始就第一个字符就不能合法转换的)返回的就是0
    doushiyinweini
        12
    doushiyinweini  
       2015-07-16 21:27:59 +08:00
    var_dump( 2 == "2b" ); // 有人说你2,其实就是说你2b的意思 所以 return true;
    picasso250
        13
    picasso250  
       2015-07-17 11:45:33 +08:00
    这里是PHP的比较表
    http://php.net/manual/en/types.comparisons.php
    在==的比较那里,可以看到 "php"==0的结果是true

    当然,lz想要知道的是更深层的机制:
    http://php.net/manual/en/language.operators.comparison.php
    ==号的比较规则是比较 类型转换 后的值,如相同,则返回true

    然后按照后面的表比较,很显然,左边的是 string, resource or number ,而右边的也是string, resource or number,此种情况下,都转换成数字再进行比较

    剩下的就是11楼讲述的啦。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:20 · PVG 04:20 · LAX 12:20 · JFK 15:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.