「PHP编程」var_dump(1…9)输出什么?旧方法新知识

2022-10-11 20:30:41 175 0
魁首哥

今天从鸟叔的博客看到了一篇文章,文章提出了一个问题: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
上一篇:30、php处理命名空间的类加载器 下一篇:centos6.5编译安装php-7.2.5.tar.gz教程

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码