php之var_dump(1...9)会输出什么?
发布:smiling 来源: PHP粉丝网 添加日期:2022-06-07 09:04:42 浏览: 评论:0
var_dump(1...9)会输出什么?下面本篇文章给大家分析一下,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
一个问题, var_dump(1...9)输出什么?
动手验证下:
php -r “var_dump(1...9)”;
string(4) ”10.9“
输出10.9, 乍一看这个var_dump的输出很奇怪是不是? 为什么呢?
这里教大家,如果看到一段PHP代码感觉输出很奇怪,第一反应是看下这段代码生成的opcodes是啥,虽然这个问题其实是词法分析阶段的问题,不过还是用phpdbg分析下吧(一般为了防止opcache的影响,会传递-n):
- phpdbg -n -p /tmp/1.php
- function name: (null)
- L1-35 {main}() /tmp/1.php - 0x7f56d1a63460 + 4 ops
- L2 #0 INIT_FCALL<1> 96 "var_dump"
- L2 #1 SEND_VAL "10.9" 1
- L2 #2 DO_ICALL
- L35 #3 RETURN<-1> 1
所以这么看来,早在生成opcode之前,1...9就变成了常量10.9,考虑到这是字面量,我们现在去看看zend_language_scanner.l, 找到这么一行:
DNUM ({LNUM}?"."{LNUM})|({LNUM}"."{LNUM}?)
这个是词法分析定义的浮点数的格式,到这里也就恍然大悟了:
1...9 会被依次接受为: 1. (浮点数1), 然后是 . (字符串连接符号) 然后是.9(浮点数0.9)
所以在编译阶段就会直接生成 “1” . “0.9” -> 字符串的字面量”10.9”
好了,到这里,这个小“谜题”就解释清楚了。
当然这个也不仅仅是PHP会这么定义了,几乎所有的语言都会定义这种缩写浮点数都形式. C语言中有的时候我们为了输入一个浮点型的整形,就可以采用比如 1. 来告诉编译器这是个浮点数.
只不过,一来刚好在PHP中.号还有另外一层含义就是字符串连接,二来...在PHP5.6之后是个新的操作符叫做Splat operator, 可以用来定义可变参数函数,或者解数组,比如,
- <?php
- function foo($a, $b, $c) {
- var_dump($a + $b + $c);
- }
- $parameters = array (1, 2, 3);
- foo(...$parameters);
- ?>
所以, 乍一看才会导致了这个看起来很困惑的结果。
Tags: var_dump
- 上一篇:谈谈PHP中require和include的区别
- 下一篇:最后一页
相关文章
- ·php中var_dump()函数的详解说明(2013-11-11)
- ·PHP中print_r、var_export、var_dump用法介绍(2014-01-16)
- ·php var_export 与 var_dump的分析区别(2014-05-14)
- ·php中var_dump()函数的详解说明(2014-09-13)
- ·php中var_dump()函数输出省略号问题解决方法(2018-10-19)
- ·PHP中echo,print_r与var_dump区别分析(2021-04-15)

推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)