起因
V2EX看到这帖子,平时是没试过这么玩,出于好奇翻了一下源码

分析
[] > 123; 为例

①略过词法分析语法分析AST生成,可以看到 op1 > op2 的操作等同于 op2 < op1,调用函数 is_smaller_function(result, op2, op1)


②接着调用 compare_function, 这里的 op1 == 123,op2 == []


③ compare_function 其实就是各种类型的比较判断,引用类型转换继而比较blablabla,省略这些代码,因为当我们 op2 == IS_ARRAY 的时候都不成立,最终到达上图的判断,可以看到op1的值已经被忽略,所以无论是 123 还是 PHP_MAX_INT,result = -1 接着返回成功。回到图2,比较结果变成了 result = -1 < 0; 恒为 true。

结论
数组 > 任意数字类型 == true; 其他类型的比较也在compare_function找到,有兴趣的翻翻吧。

参考

  • PHP7.2-SRC

Go语言中slice作为函数参数

Go语言中slice作为函数参数 Continue reading

PHP7数组扩容和rehash

Published on December 24, 2018

PHP7中的packed array

Published on December 09, 2018