引用变量的定义
用不用的名字访问同一个变量内容 &
延伸 :php引用变量的原理
1 变量空间存储方式
$a = range(0,1000);
var_dump(memory_get_usage());
//变量a会开辟one空间,存储a,将a赋值给b之后,b不会占用一个新的空间,会和a共用一块空间,a和b同时指向one空间
$b = $a;
var_dump(memory_get_usage());
//对a进行修改 写操作 此时原来a就不会指向one空间,b指向one空间,a会开辟一块新空间two空间
$a = range(1,1000);
var_dump(memory_get_usage());
2 引用
$a = range(0,1000);
var_dump(memory_get_usage());
//变量a会开辟one空间,使用引用之后,将a的地址给了b,a和永远会指向同一空间
$b = &$a;
var_dump(memory_get_usage());
//对a进行修改,改掉的只是空间值,使用引用之后,永远指向同一个空间,a和b的值是修改之后的值
$a = range(1,1000);
var_dump(memory_get_usage());
zval结构体
$a = range(0,3);
xdebug_debug_zval('a');
打印结果如下
1 代表变量空间的变量个数 2 是否有引用
unset 只会取消引用,不会销毁内存空间
$a = 1;
$b = &$a;
unset($b);
echo $a;die();
将$a的引用给去掉,则打印$a为1,$b就是不存在的变量了
对象 本身就是引用,不需要加引用符号
class Person{
public $name = '张三';
}
$p1 = new Person();
$p2 = $p1;
$p2->name = '王五';
真题分析
$data = ['a','b','c'];
foreach($data as $key => $val){
$val = &$data[$key];
}
//程序运行时,每一次循环结束后变量$data的值是什么,请解释
//程序执行完成后,变量$data的值是什么,请解释