引用变量的定义和符号
引用变量:用不同的名字来访问同一变量的内容,符号为&;
注意:除了用&表示引用变量外,其实对象也是引用传递
引用传递和值传递
相同点:都是用两个名字来访问同一个变量的内容
不同点:值传递不会改变传递前的变量的值,即原有的变量和复制后的变量之间在COW(写后复制)后没有联系;引用传递原有变量和复制后的变量都指向同一变量的内容
值传递
$a = 1;
$b = $a;
$a = 2;
echo $b;
注意:在传递的过程中,为了节省空间,在开始的时候,会使用COW原则(copy on write:只有执行写操作的时候才会在内存中开辟新的空间)
![]()
值传递在写操作之后,会重新开辟新的空间,用来存储b变量指向的内容
引用传递
//引用传递
$a = 1;
$b = &$a;//引用传递的符号&
$a = 2;
echo $b;//result:$b = 2
![]()
引用传递在写操作之后,b变量也同样指向a变量所指向的内容
$a = 1;
$b = &$a;
$b = 2;
unset($b);
echo $a;
![]()
综合题目解析
$arr = array('A','B','C');
foreach($arr as $key => $value){
$value = &$arr[$key];
}
//$arr as $key => $value,$key为arr数组的下标,$value为arr数组下标所对应的值
//第一趟循环
$key = 0
$arr[0] = 'A'
$value = &$arr[0] = 'A'
第一趟循环中,value变量和arr[0]变量指向同一内容'A'
//第二趟循环
$key = 1;
$arr[1] = 'B';
value变量先赋值为arr[0],后重新指向到arr[1]所指向的内容
即value刚开始所指向的arr[0]的内容先被改变,而后value变量重新指向到arr[1]所对应的内容
$arr[0] = $value = 'B'
$value = &$arr[1]
//第三趟循环
$key = 2;
$arr[2] = 'C'
value变量先赋值为arr[2]的值,而后重新指向arr[2]所指向的内容
$value = $arr[1] = 'C'
$value = &arr[2]
![]()