首先需要弄清楚几个概念:
变量名和变量的值是两个概念,
变量名是指一段内存空间,
空间里面存放的才是变量的值。
传值和传引用的区别
按值传递
1.在函数范围内对值得任何改变在函数外部都会被忽略
2.按值传递时,php必须复制值,如果是大型字符串或是对象等,这是一个代价很大的操作,耗内存。
按引用传递
1.在函数内对值得任何改变,在函数外部也能反映出来
2.按引用传递时不需要复制值,对于性能提高有好处
例一:
1 <?php 2 $a= 'hello world'; 3 $b = &$a; 4 unset($a); //只是解除了变量名和值之间的对应关系$a被销毁了,但是$b还存在 5 echo $b; // hello world,只有没有任何变量引用改地址了,内存才会回收。
如图所示
unset($a)前
unset($b)后
例二:
1 <?php 2 3 $data=array('a','b','c'); 4 foreach($data as $key=>$value){ 5 $value=&$data[$key]; /**引用赋值,即将$value指向$data[$key]的地址, 6 * 下次改变$value的值,也就改变了$data[$key]的 7 * 值,这是理解此题的关键. 8 */ 9 print_r($data); //每次循环后将$data打印出来,便于分析结果。 10 echo '<br/>'; 11 } 12 13 print_r($data); 14 15 Array ( [0] => a [1] => b [2] => c ) //第一次循环,数组没有改变,但是$value指向了$data[1] 16 Array ( [0] => b [1] => b [2] => c ) //第二次循环,此时将b赋值给了$value,所以$data[1]在第二次循环发生了改变,同时$value指向了$data[2]; 17 Array ( [0] => b [1] => c [2] => c ) //第三次循环,过程同第二次,将$data[2]的值改变了