How PHP Reference works?

来源:互联网 发布:数据库系统实现 epub 编辑:程序博客网 时间:2024/06/08 03:33

简单的看一下php reference 是如何工作的
<?php
/* 图片为内存变化图
 ______________________________
|pointer | value | variable              |
 -----------------------------------
|   1     |  NULL  |         ---           |
|   2     |  NULL  |         ---           |
|   3     |  NULL  |         ---           |
|   4     |  NULL  |         ---           |
|   5     |  NULL  |         ---           |
------------------------------------
创建一些变量  */
$a=10;
$b=20;
$c=array ('one'=>array (1, 2, 3
));
/* 查看内存
 _______________________________
|pointer | value |       variable's       |
 -----------------------------------
|   1     |  10     |       $a               |
|   2     |  20     |       $b               |
|   3     |  1       |      $c['one'][0]   |
|   4     |  2       |      $c['one'][1]   |
|   5     |  3       |      $c['one'][2]   |
------------------------------------
do  */
$a=&$c['one'][2];
/*
查看内存
 _______________________________
|pointer | value |       variable's       |
 -----------------------------------
|   1     |  NULL  |       ---              |  // $a 的值被销毁并且 pointer free
|   2     |  20     |       $b               |
|   3     |  1       |      $c['one'][0]   |
|   4     |  2       |      $c['one'][1]   |
|   5     |  3       |  $c['one'][2]  ,$a | // $a
现在在这里
------------------------------------
do  */
$b=&$a;  //  "$c['one'][2]" 和 "$a" 为同一pointer.
/*
查看内存
 _________________________________
|pointer | value |       variable's           |
 --------------------------------------
|   1     |  NULL  |       ---                  | 
|   2     |  NULL  |       ---                  |  //$b 的值被销毁并且 pointer  free
|   3     |  1       |      $c['one'][0]       |
|   4     |  2       |      $c['one'][1]       |
|   5     |  3       |$c['one'][2]  ,$a , $b |  // $b 现在在这里
---------------------------------------
next do */
unset($c['one'][2]);
/*
查看内存
 _________________________________
|pointer | value |       variable's           |
 --------------------------------------
|   1     |  NULL  |       ---                  | 
|   2     |  NULL  |       ---                  | 
|   3     |  1       |      $c['one'][0]       |
|   4     |  2       |      $c['one'][1]       |
|   5     |  3       |      $a , $b              | // $c['one'][2] 被销毁
---------------------------------------
next do   */
$c['one'][2]=500   //now it is in array
/*
查看内存
 _________________________________
|pointer | value |       variable's           |
 --------------------------------------
|   1     |  500    |      $c['one'][2]       | 
|   2     |  NULL  |       ---                  | 
|   3     |  1       |      $c['one'][0]       |
|   4     |  2       |      $c['one'][1]       |
|   5     |  3       |      $a , $b              | //这个指针正在被使用
---------------------------------------

$c['one'][2]=&$a;
unset(
$a);
unset(
$b
);  
/*
查看内存
 _________________________________
|pointer | value |       variable's           |
 --------------------------------------
|   1     |  NULL  |       ---                  | 
|   2     |  NULL  |       ---                  | 
|   3     |  1       |      $c['one'][0]       |
|   4     |  2       |      $c['one'][1]       |
|   5     |  3       |      $c['one'][2]       | //$c['one'][2] 被返回, $a,$b 被销毁
--------------------------------------- ?>

原创粉丝点击