定义:不同变量名指向同一变量内容(地址)
符号:&
<?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']