samael
V2EX  ›  PHP

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

  •  
  •   samael · Jul 16, 2015 · 3043 views
    This topic created in 4016 days ago, the information mentioned may be changed or developed.

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

    $str = "aaaa";
    if($str == 0) {
        echo ('What the fuck'); // 为什么在这里?
    } else {
        echo ('I wanna it');
    }
    
    Supplement 1  ·  Jul 16, 2015
    结贴

    lua 里字符转数字 为 nil nil == 0 是false
    js 里字符转数字 为 NaN NaN == 0 是false
    python 里字符串与数字对比没有隐式转换
    13 replies    2015-07-17 11:45:33 +08:00
    b821025551b
        1
    b821025551b  
       Jul 16, 2015
    字符“aaaa”对应类型为false;
    0对应类型为false;
    false===false
    wy315700
        2
    wy315700  
       Jul 16, 2015
    ==不检查类型
    ===会检查类型
    lincanbin
        3
    lincanbin  
       Jul 16, 2015
    弱类型语言的隐式转换,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
       Jul 16, 2015
    lua javascript python 这样的弱类型语言在对比 str == 0 全返回的是false
    我是想知道php为什么会这样处理
    arzusyume
        5
    arzusyume  
       Jul 16, 2015
    js里"aaaa"转Number是NaN,
    php里intval的结果就是0

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

    你改成"1aaa" 就不相等了
    lijinma
        9
    lijinma  
       Jul 16, 2015
    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  
       Jul 16, 2015
    1L 这理论从哪个语言来的
    realpg
        11
    realpg  
       Jul 16, 2015
    PHP的==跟判断机制变量类型有关

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

    而且intval保证返回的是一个int类型的数字,所以异常的输入(比如从头开始就第一个字符就不能合法转换的)返回的就是0
    doushiyinweini
        12
    doushiyinweini  
       Jul 16, 2015
    var_dump( 2 == "2b" ); // 有人说你2,其实就是说你2b的意思 所以 return true;
    picasso250
        13
    picasso250  
       Jul 17, 2015
    这里是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楼讲述的啦。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1571 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 16:33 · PVG 00:33 · LAX 09:33 · JFK 12:33
    ♥ Do have faith in what you're doing.