概念
在PHP中引用意味着用不同的名字访问同一个变量内容
定义方式
使用 &
符号
举例说明---传值赋值
<?php
//定义变量
$a = range(0, 100);
var_dump(memory_get_usage()); //int(399112)
xdebug_debug_zval('a'); //a:(refcount=1, is_ref=0) //recount表示变量指向的内存地址引用个数 is_ref表示是不是引用
//定义另一个变量,将a变量赋值给A
//COW机制
$A = $a;
var_dump(memory_get_usage()); //int(399112)
xdebug_debug_zval('a'); //(refcount=2, is_ref=0)
xdebug_debug_zval('A'); //(refcount=2, is_ref=0)
//对a变量重新赋值
$a = range(0, 100);
var_dump(memory_get_usage()); //int(407360)
xdebug_debug_zval('a'); //(refcount=1, is_ref=0)
xdebug_debug_zval('A'); //(refcount=1, is_ref=0)
举例说明---引用赋值
<?php
//定义变量
$a = range(0, 100);
var_dump(memory_get_usage()); //int(399112)
xdebug_debug_zval('a'); //a:(refcount=1, is_ref=0)
//定义另一个变量,将a变量赋值给A
//COW机制
$A = &$a;
var_dump(memory_get_usage()); //int(399136)
xdebug_debug_zval('a'); //(refcount=2, is_ref=1)
xdebug_debug_zval('A'); //(refcount=2, is_ref=1)
//对a变量重新赋值
$a = range(0, 100);
var_dump(memory_get_usage()); //int(399136)
xdebug_debug_zval('a'); //(refcount=2, is_ref=1)
xdebug_debug_zval('A'); //(refcount=2, is_ref=1)
当变量引用时,unset只会取消引用,不会销毁内存空间
<?php
$a = 1;
$A = &$a;
unset($A);
echo $a; //1
类本身就是引用传值
<?php
//写出如下程序的输出结果
$d = ['a', 'b', 'c'];
foreach ($d as $k => $v) {
$v = &$d[$k];
/*
array(3) {
[0]=>
&string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
array(3) {
[0]=>
string(1) "b"
[1]=>
&string(1) "b"
[2]=>
string(1) "c"
}
array(3) {
[0]=>
string(1) "b"
[1]=>
string(1) "c"
[2]=>
&string(1) "c"
}
*/
}
/*
array(3) {
[0]=>
string(1) "b"
[1]=>
string(1) "c"
[2]=>
&string(1) "c"
}
*/
//程序运行时,每一次循环结束后变量 $d 的值是什么?请解释。
//程序执行完成后,变量 $d 的值是什么?请解释。
/*
step1 : $k = 1,$d = ['a', 'b', 'c'],$v=a, $v=$d[1];
step2 : $k = 2,$d = ['b', 'b', 'c'],$v=b, $v=$d[2];
step2 : $k = 3,$d = ['b', 'c', 'c'],$v=c, $v=$d[3];
*/