今天从鸟叔的博客看到了一篇文章,文章提出了一个问题:var_dump(1…9)输出什么?相信很多人和我一样,在看到这篇文章之前,可能都没有对这个问题作过深入的思考。
var_dump(1…9)输出什么?我们先执行一下看看!
从上图看,我们知道实际结果是10.9!是不是超出了大家的想象?
这里教大家一个查找问题的方法,如果你看到一段PHP代码输出很奇怪,第一反应是看下这段代码生成的opcodes是啥。虽然,这个问题其实是词法分析阶段的问题,不过你还是用phpdbg分析下吧,如下:
从图中我们可以看到,早在生成opcode之前,1…9就变成了常量10.9。考虑到这是字面量,我们现在去看看zend_language_scanner.l,找到这么一行:
DNUM ({LNUM}?”.”{LNUM})|({LNUM}”.”{LNUM}?)
这个是PHP定义的词法分析定义的 浮点数 格式,在上面的var_dump(1…9)中,1…9实际会被依次接受为:(1.) 浮点数1,(.) 字符串 连接符号, (.9)浮点数0.9。
其实这种浮点数格式,并不是PHP独有的,实际上几乎所有的 编程语言 都会定义。但是我们之所以容易迷惑,可能有两方面的原因,一是刚好在PHP中(.)号还有另外一层含义就是字符串连接,二是(…)在PHP5.6之后有个新的操作符叫做Splat operator,可以用来定义可变参数函数,或者解数组,比如:
所以, 乍一看才会导致了这个看起来很困惑的结果。
好了,到这里,这个小“谜题”就解释清楚了。大家懂了吗?
海报
0 条评论
175
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~