引用变量的考点
- 真题: 什么是引用变量? 在PHP当中,用什么符号定义引用变量?
- 考点:PHP的引用变量的概念及定义方式和PHP引用变量的原理
- 概念:在PHP中引用意味着用不同的名字访问同一个变量内容。
- 定义方式:使用 & 符号
- 工作原理:
变量
// 定义一个变量
$a = range(0, 1000); // 创建一个0-1000的数组
var_dump(memory_get_usage()); // 查看内存使用情况
// 定义一个变量b, 将a的值赋给b
$b = $a; // $b 不会开辟空间,在 php 中使用 COW (Copy On Write)
var_dump(memory_get_usage()); // 查看内存使用情况
// 对a进行修改, 也就是进行了写操作, 这时候$a重新开辟空间
$a = range(0, 1000);
var_dump(memory_get_usage()); // 查看内存使用情况
结果:
int(558352) int(558352) int(595272)
看变量容器
// 变量容器 - Zval
$a = range(0, 3);
xdebug_debug_zval('a'); // 需要安装xdebug才能用这个函数
$b = $a;
xdebug_debug_zval('a');
$a = range(0, 3);
xdebug_debug_zval('a');
结果:
(refcount: 引用个数,is_ref: 是否是引用)
引用变量
$a = range(0, 1000); // 创建一个0-1000的数组
var_dump(memory_get_usage()); // 查看内存使用情况
$b = &$a;
var_dump(memory_get_usage());
$a = range(0, 1000);
var_dump(memory_get_usage()); // 查看内存使用情况
结果
int(558352) int(558376) int(558376) // 内存使用差不多
// 变量容器 - Zval
$a = range(0, 3);
xdebug_debug_zval('a'); // 需要安装xdebug才能用这个函数
$b = &$a;
xdebug_debug_zval('a');
$a = range(0, 3);
xdebug_debug_zval('a');
看变量容器
关于 unset
$a = 1;
$b = &$a;
unset($b); // unset只会取消引用,不会销毁空间
echo $a; // 空间没有销毁,$a 还是有值
对象(默认引用传递)
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');