牛骨文教育服务平台(让学习变的简单)
博文笔记

PHP底层-引用数组

创建时间:2016-09-02 投稿人: 浏览次数:440

代码举例分析1:

$arr = array(11,22,33);
$tmp = $arr;

php中定义数组,结构如下,zvalue对应的是指针值,该指针指向一个hashtable,hashtable中第一位是可以理解成数组key,第二位是内存地址,指向一个普通变量的zvalue结构;type对应的是is_array,refcount_gc=1,is_ref_gc=0;当将arr赋值给tmp时,底层会将refcount_gc+1。
流程如下图:

这里写图片描述

代码举例分析2:

$arr = array(11,22,33);
$tmp = $arr;
$arr[1] = 99;
echo $tmp[1];

赋值99的时候,会发生分裂。
流程如下图:
这里写图片描述

特殊的怪现象:

/** 例子1 */
$arr = array(11,22,33);
$x= &$arr;
$tmp = $arr;
$arr[1] = 99;
echo $tmp[1]; // 11

/** 例子2 */
$arr = array(11,22,33);
$x= &$arr[1];
$tmp = $arr;
$arr[1] = 99;
echo $tmp[1]; // 99

可以理解为x将arr[1]对应的值变成了引用,php不会去检测数组里面的变化,这个不算bug,因为检测的话代价比较大

引用时的怪现象

$arr = array(11,22,33);
foreach($arr as $v) {
}
var_dump(current($v)); // 最后数组指针停留在数组结尾,取不到值,false

foreach的时候,想当于copy一个arr,在这取为arrcopy,foreach里面操作的是arrcopy,arr和$arrcopy指针依次往下指

$arr = array(11,22,33);
foreach($arr as $k=>$v) {
    $arr[$k] = $v;
}
var_dump(current($arr)); // 22

上面情况当,重新赋值arr,arrcopy和arr分裂,arrcopy指针一直跟着foreach跑,但是$arr的指针依然停留在第二个单元,即44;

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。