概念
在PHP中,引用意味着用不同的名字访问同一个变量内容。
定义方式
使用 & 符号
将一个变量的值赋值给另一个变量,其中一个变量的值进行改变,会重新进行拷贝,此时会再开辟一个新的内存空间。
// 1. 定义一个变量 $a = range(0, 1000); // 在内存中开辟一片空间,存储变量a var_dump(memory_get_usage()); // 2. 定义变量 b,将 a变量的值赋值给 b $b = $a; // 将变量b 指向 变量a开辟的空间中 var_dump(memory_get_usage()); // 3. 对 a进行修改 $a = range(0, 1000); var_dump(memory_get_usage());原理:使用了 COW(Copy On Write)机制 : 对 $a 或 $b 其中一个进行改变,内存空间才会发生改变。
在内存中开辟一片空间存储变量a;将变量b 指向 变量a的内存空间中;对变量a进行修改(对a进行写操作),此时会再开辟一片内存空间存储 a 和 a和 a和b(原来的 a 和 a和 a和b被改变)两个变量无论何时都共用一个内存空间(对其中一个的值进行更改的时候,不会开辟新的内存空间)
// 1. 定义一个变量 $a = range(0, 1000); var_dump(memory_get_usage()); // 2. 定义变量b, 将a变量的值赋值给b $b = &$a; var_dump(memory_get_usage()); // 3. 对a进行修改 $a = range(0, 1000); var_dump(memory_get_usage());原理:
定义一个变量a(开辟一个内存空间存储变量a);定义变量 b , 将 b,将 b,将a的地址给了 b , 此 时 b,此时 b,此时b与$a指向同一个内存空间,且永远指向该内存空间(不会再重新拷贝,改掉的只是该内存空间的值);对a进行修改(不会再开辟内存空间),此时 a 和 a和 a和b的值,都是修改后的值;程序运行时,每一次循环结束后变量 $data的值时什么?请解释
程序执行完成后,变量 $data的值时什么?请解释
1)答案:
// 第一次循环 $data = ['a', 'b', 'c']; // 第二次循环 $data = ['b', 'b', 'c']; // 第三次循环 $data = ['b', 'c', 'c']; // 程序执行完成后,变量 $data的值 $data = ['b', 'b', 'c'];2)解析:
1)foreach ($data as $key => $val) 会将$data第一个元素的键名赋值给$key,将$data的第一个元素的值赋值给$val(即$k=0; $v=a;) 2) $val = &$data[$key]; $v = &$data[0];(即$v拿了$data[0]的地址) $v = &$data[0] = a(此时$data[0]和$v都指向 a内存空间) 以上步骤即为: 1)第一次循环: $k = 0; $v = a; $v = &$data[0]; ($v = &$data[0] = a,$v 和 $data[0] 都指向 a内存空间) // 结果:$data = ['a','b','c']; 2)第二次循环: $k = 1; $v = b; $data[0] = b; $v = &$data[1]; ($v = &$data[1] = b, $v 和 $data[1] 都指向 b内存空间) // 结果:$data = ['b','b','c']; 3)第三次循环: $k = 2; $v = c; $data[1] = $c; $v = &$data[2]; ($v = &$data[2] = c, $v 和 $data[1] 都指向 c内存空间) // 结果:$data = ['b','c','c'];3)代码测试:
$data = ['a', 'b', 'c']; foreach ($data as $k => $v) { $v = &$data[$k]; var_dump($data); } var_dump($data);运行结果:
