php 引用变量

663 阅读1分钟

定义:不同变量名指向同一变量内容(地址)

符号:&

<?php
//定义变量$a,内存开辟一个空间保存'a',$a指向该空间
$a = 'a';

//定义变量$b,因为cow(copy on write)特性,$a,$b都引向'a'
$b = $a;

//如果改变$a的值,内存又开辟空间保存,$a指向该空间。此时$b还是指向原来的空间
$a = 'hello';

//可以使用xdebug_debug_zval('a')检查,需要扩展Xdebug


//--------------------------

$c = 'bbq';
//使用引用变量,$a,$b都引向'a'
$d = &$c;
$c = 'test';

echo $d ; //'test'使用引用传递 

//引用变量使用unset(),只会销毁变量名,不会销毁内间
unset($d);
echo $c;    //'test' 值依然存在


//-------------------------
//对象本身就是引用传递
class Ob{    public $name = 'cc';}
$obj1 = new Ob;
$obj2 = $obj1;
echo $obj2->name;
$obj2->name = 'hh';
echo $obj1->name;//如果创建一个新的对象,需要使用clone

//-------考题--------
$arr = ['a','b','c'];
foreach($arr as $k => $v){
   $v = &$arr[$k];
}
//问题最终的结果及每次循环的值

//第一次,$v$arr[0]引用传递,都指向'a'     
//$k => 0
//$v      => 'a'
//$arr[0] => 'a' 
//$arr = ['a','b','c']

//第二次,$v$arr[1]引用传递,都指向'b'     
//$k => 1
//$v      => 'b',$v$arr[0]引用传递,此时$arr[0]=>'b'
//$arr[1] => 'b' 
//$arr = ['b','b','c']

//第三次,$v$arr[2]引用传递,都指向'c'     
//$k => 2
//$v      => 'c' $v$arr[1]引用传递,此时$arr[1]=>'c'
//$arr[2] => 'c' 
//$arr = ['b','c','c']