深入了解PHP类型戏法 (array)var 强制数组转换
2011-08-13 21:49
344 查看
让我们看一下,有一个转换数组的函数:
为什么要加
单单 $arr = (Array) $object;就可以转换成数组了,加上那么一段代码是不是多此一举呢?
刚看到的时候我也很蒙,似乎的确是比较画蛇添足,唯一有价值的线索信息是其中的正则/^.+\0/,其他的都好理解,关键在于\0是个什么玩意儿。
搜索一番无果,突然想起在直接使用(array)这种方式转换时,php会在protected和private属性的键上做一些“手脚”,于是写了demo如下
复制代码
也就是说private属性前面会加类名,protected前面会加星号。加上那一段代码后,转换的结果不一样,输出如下
复制代码
输出结果是非常”干净整洁“的内容,不用说,玄机就在正则中的[b]\0。
可以确定的是,\0肯定是一个非法字符,但是\0为什么能干掉前面一大堆的东西,继续查资料发现:上面所述的myclassb和*c并不是真的”眼见为实”,他们实际上是\0myclass\0b和\0*\0c,这个\0,是一个asc码为0的字符(不懂asc码的自己去查),也就是说,.+\0这一段正则,正好匹配了php在实际属性值前面加上的那一段,也就最后生成了”干净整洁“的数组。
function object_to_array($object) { $arr = (array) $object; foreach($arr as $k => $v) { unset($arr[$k]); $arr[preg_replace('/^.+\0/', '', $k)] = $v; } return $arr; }
为什么要加
foreach($arr as $k => $v) { unset($arr[$k]); $arr[preg_replace('/^.+\0/', '', $k)] = $v; }
单单 $arr = (Array) $object;就可以转换成数组了,加上那么一段代码是不是多此一举呢?
刚看到的时候我也很蒙,似乎的确是比较画蛇添足,唯一有价值的线索信息是其中的正则/^.+\0/,其他的都好理解,关键在于\0是个什么玩意儿。
搜索一番无果,突然想起在直接使用(array)这种方式转换时,php会在protected和private属性的键上做一些“手脚”,于是写了demo如下
复制代码
<?php class myclass{ public $a='a'; private $b='b'; protected $c='c'; } $o = new myclass(); print_r((array)$o); 输出 Array( [a] => a [myclassb] => b [*c] => c )
也就是说private属性前面会加类名,protected前面会加星号。加上那一段代码后,转换的结果不一样,输出如下
复制代码
Array( [a] => a => b [c] => c )
输出结果是非常”干净整洁“的内容,不用说,玄机就在正则中的[b]\0。
可以确定的是,\0肯定是一个非法字符,但是\0为什么能干掉前面一大堆的东西,继续查资料发现:上面所述的myclassb和*c并不是真的”眼见为实”,他们实际上是\0myclass\0b和\0*\0c,这个\0,是一个asc码为0的字符(不懂asc码的自己去查),也就是说,.+\0这一段正则,正好匹配了php在实际属性值前面加上的那一段,也就最后生成了”干净整洁“的数组。
相关文章推荐
- 深入了解PHP中的Array数组和foreach
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型
- 对Java字符类型的深入了解(转贴) .
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--PHP的哈希实现
- PHP中的array数组类型分析说明
- JavaScript 参数 arguments深入了解以及javascript内置数据类型的讨论
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--常量
- 深入了解php.ini
- 深入PHP内核之in_array
- 深入PHP内核(一)——弱类型变量原理探究
- 从PHP的源码中深入了解stdClass类
- 深入了解php底层机制(-)
- 深入了解php opcode缓存原理
- 【问底】王帅:深入PHP内核(一)——弱类型变量原理探究
- 深入了解php opcode缓存原理
- 为mutable类型的容器(array,set等)添加kvo,有点麻烦,供参考和了解下吧
- 深入PHP内核(一)——弱类型变量原理探究
- 深入了解JavaScript对象(1)--原始类型和引用类型
- 深入PHP内核(一)——弱类型变量原理探究
- PHP之include/require深入了解