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

PHP 中,为何 [] > n == true ?

  •  
  •   yazi · 2019-01-10 11:26:56 +08:00 · 3778 次点击
    这是一个创建于 2137 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天无意间遇到的问题,拿一个数组和任何数字大于比较都是 true,小于比较都是 false (目前测试是这样)。

    查了 PHP 数组操作符,发现只有 + == != 等这些,并没有 < 或 > 。

    http://php.net/manual/zh/language.operators.array.php

    Google 也查了,没有发现有价值的信息(也可能是我查询姿势不对),所以来请教下各位 V 油为何会有这样的结果?


    我测试的 PHP 版本有 PHP 5.6.36 、PHP 7.2.10

    10 条回复    2019-01-10 14:54:03 +08:00
    xnode
        1
    xnode  
       2019-01-10 11:32:51 +08:00
    好像是 把数组转成 string n 也转换成 string 然后再比较
    WuwuGin
        2
    WuwuGin  
       2019-01-10 11:36:17 +08:00   ❤️ 1
    $a <> $b Inequality TRUE if $a is not equal to $b.
    https://secure.php.net/manual/en/language.operators.array.php
    Fuor
        3
    Fuor  
       2019-01-10 11:43:22 +08:00   ❤️ 2
    http://php.net/manual/zh/language.operators.comparison.php

    array 和任何其它类型比较,array 总是更大
    liuguang
        4
    liuguang  
       2019-01-10 11:44:28 +08:00
    这样搞有意义吗?无非就是数据转换,谁先谁后的问题,根本用不到这种代码
    orqzsf1
        5
    orqzsf1  
       2019-01-10 11:47:36 +08:00
    couashi
        6
    couashi  
       2019-01-10 11:52:37 +08:00   ❤️ 1
    真的无聊
    KomeijiSatori
        7
    KomeijiSatori  
       2019-01-10 12:11:48 +08:00
    为啥要用数组和数字比较呢(
    yazi
        8
    yazi  
    OP
       2019-01-10 12:33:15 +08:00
    @liuguang 对的,这样是没意义的,正因为没意义所以平常也不会这么写。今天偶然这么写了句发现返回的是 true,觉得有意思就查了下(
    solupro
        9
    solupro  
       2019-01-10 14:53:00 +08:00
    先不管什么时候会这么用, 由于感兴趣翻了一下源码,我来尝试解答一下吧。

    [] > 整型

    前略,这两个类型比较最终调用了函数 is_smaller_function ( https://github.com/php/php-src/blob/54dc07f3dc9fa2fcfeb2d2c6aebf79bd34ab041c/Zend/zend_operators.c#L2243)

    然后调用的是 compare_function,这里的 op1 是整型 IS_LONG,op2 是数组 IS_ARRAY ;
    接着这函数前面一大堆代码不用看了到 +2146 行
    else if (Z_TYPE_P(op2)==IS_ARRAY) {
    ZVAL_LONG(result, -1);
    return SUCCESS;
    }
    直接返回了-1

    ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));

    到这里 -1 < 0 所以比较的结果就为 true 了。

    PS:我本地版本的源码 op2 == IS_OBJECT 也会返回 -1,但是 GitHub 上的版本已经删除了这个判断
    solupro
        10
    solupro  
       2019-01-10 14:54:03 +08:00
    这排版。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2835 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.