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

2019-01-10 11:26:56 +08:00
 yazi

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

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

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

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


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

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

array 和任何其它类型比较,array 总是更大
liuguang
2019-01-10 11:44:28 +08:00
这样搞有意义吗?无非就是数据转换,谁先谁后的问题,根本用不到这种代码
orqzsf1
2019-01-10 11:47:36 +08:00
couashi
2019-01-10 11:52:37 +08:00
真的无聊
KomeijiSatori
2019-01-10 12:11:48 +08:00
为啥要用数组和数字比较呢(
yazi
2019-01-10 12:33:15 +08:00
@liuguang 对的,这样是没意义的,正因为没意义所以平常也不会这么写。今天偶然这么写了句发现返回的是 true,觉得有意思就查了下(
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
2019-01-10 14:54:03 +08:00
这排版。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/525638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX