一、引用变量 &
引用赋值,系统只生成一块内存 $a = 'xiaofan'; $b = &$a; $a = 'xiaofan';
&引用赋值,$a与$b操作同一块内存。即使修改$a或$b,还是同一块内存,不会增加。
如果使用普通的赋值,系统的内存会有以下的变化。这里值得说的是PHP内核有个COW机制:写入时才真正复制一份内存进行修改,也就是$b = $a赋值时,并不会创建新内存。只有在$a或$b被写入修改时才会新增一块内存,是一种内存优化机制。
//创建$a,系统会产生一块内存 $a = 'xiaofan'; //将$a赋值给$b,系统此时仍是指向同一块内存,不会增加一块新内存 $b = $a; //如果对$a进行修改,系统此时会增加一块新内存给$a,而$b仍指向之前的那块内存 $a = 'xiaofan';
使用unset操作引用变量时,不会销毁内存中的值
$a = 'xiaofan'; $b = &$a; unset($b); echo $a; //结果为xiaofan
对象本身是引用传递
class person { public $name = 'xiaofan'; } $a = new person; $b = $a; $a->name = 'zhangsan'; echo $b->name; //输出zhangsan
如果是需要完全复制一个对象,可以使用clone方法。
真题测试:
$data = array('a', 'b', 'c'); foreach($data as $key => $value){ $value = &$data[$key]; } var_dump($data); //结果array('b', 'c', 'c')