(1)PHP引用变量
概念:不同的变量名,访问同一个变量内容,使用&
知识点:
使用php函数
(a)memory_get_usage() 查看内存使用情况
eg
// 定义一个变量 $a = range(0, 1000); var_dump(memory_get_usage());
运行结果
(b)xdebug_debug_zval() zval变量容器
eg
// zval变量容器 $a = range(0, 3); xdebug_debug_zval('a');
运行结果
refcount指在这个空间的变量有1个 is_ref指是否为引用变量 0为不是引用变量,1为是引用变量
(c) unset 只会取消引用,不会销毁空间
eg
<?php // unset 只会取消引用,不会销毁空间 $a = 1; $b = &$a; unset($b); echo $a. " ";
运行结果
过程
(d)对象不会进行空间的复制,对象本身就是引用传递(要复制需要clone,相关链接https://blog.csdn.net/sinat_29091823/article/details/72637192)
eg
<?php // 对象本身就是引用传递 class Person { public $name = "zhangsan"; } $p1 = new Person; xdebug_debug_zval('p1'); $p2 = $p1; xdebug_debug_zval('p1'); $p2->name = "lisi"; xdebug_debug_zval('p1');
运行结果已经过程
使用PHP引用变量前 eg:
<?php
// 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());
// 定义变量b,将a变量的值赋值给b
// COW Copy On Write
$b = $a;
var_dump(memory_get_usage());
// 对a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());
运行结果
过程图
使用PHP引用变量后 eg:
<?php // 定义一个变量 $a = range(0, 1000); var_dump(memory_get_usage()); // 定义变量b,将a变量的值赋值给b $b = &$a; var_dump(memory_get_usage()); // 对a进行修改 $a = range(0, 1000); var_dump(memory_get_usage());
运行结果
过程图
面试题
<?php /** * 写出如下程序的输出结果 * <?php * * $data = ['a', 'b', 'c']; * * foreach($data as $key => $val) * { * $val = &$data[$key]; * } * 程序运行时,每一次循环结束后变量$data的值是什么?请解释 * 程序执行完成后,变量$data的值是什么?请解释 */ $data = ['a', 'b', 'c']; foreach ($data as $key=>$val) { $val = &$data[$key]; var_dump($data); } var_dump($data);