深入了解PHP类型戏法 (array)var 强制数组转换

让我们看一下,有一个转换数组的函数:

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] => b
    [c] => c
)


输出结果是非常”干净整洁“的内容,不用说,玄机就在正则中的 \0
可以确定的是,\0肯定是一个非法字符,但是\0为什么能干掉前面一大堆的东西,继续查资料发现:上面所述的myclassb和*c并不是真的”眼见为实”,他们实际上是\0myclass\0b和\0*\0c,这个\0,是一个asc码为0的字符(不懂asc码的自己去查),也就是说, .+\0这一段正则,正好匹配了php在实际属性值前面加上的那一段,也就最后生成了”干净整洁“的数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值