本日从鸟叔的博客看到了一篇文章,文章提出了一个问题:var_dump(1...9)输出什么?相信很多人和我一样,在看到这篇文章之前,可能都没有对这个问题作过深入的思考。

var_dump(1...9)输出什么?我们先实行一下看看!

从上图看,我们知道实际结果是10.9!
是不是超出了大家的想象?

dumpphpPHP编程vardump19输出什么旧办法新常识 Docker

这里教大家一个查找问题的方法,如果你看到一段PHP代码输出很奇怪,第一反应是看下这段代码天生的opcodes是啥。
虽然,这个问题实在是词法剖析阶段的问题,不过你还是用phpdbg剖析下吧,如下:

一样平常为了防止opcache的影响,会通报-n

从图中我们可以看到,早在天生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,可以用来定义可变参数函数,或者解数组,比如:

以是, 乍一看才会导致了这个看起来很困惑的结果。

好了,到这里,这个小“谜题”就阐明清楚了。
大家懂了吗?