变量
$a = 1
echo memory_get_usage(), '<br />'; // 119632
$b = $a
echo memory_get_usage(), '<br />'; // 119680
$a = 1;
echo memory_get_usage(), '<br />'; // 119712
$a和 $b都指向$a的内存地址,并不会copy一块内存地址出来,因为COW(copy on writer),只有再对$a进行赋值的时候$b才能新创建一块内存地址,所以内存增加。
$b = &$a
echo memory_get_usage(), '<br />'; // 119712
$a和$b指向一个内存地址,再对$a进行修改也不会创建新的内存地址,如果unset($b)那么之后消除$b对$a的引用,并不会把$a指向的内存地址给消除了。
对象
class Person{
public $Name = “张三”;
}
$d = new Person();$e = $d;
$d->name = "zhamgsan";
?>
此时$b和$a都同时指向一个内存地址,对$a 进行修改$a->Name = "李四"后 $a$b还是指向一块地址。
练习
$data = [a,b,c]
foreach($data as $k=>$v){
$v = &$data[$k]
}
程序运行一遍后 $data打印出来是多少?
第一次循环 $k = 0 $v = a 循环体内 $v = &$data[0] = a ==> a,b,c
第二次循环 $k = 1 $v = b 因为$v变化,$v = &$data[0], 所以$data[0] = b ,循环体内 $v = &$data[1] = b ===> b,b,c
第三次循环 $k= 2 $v = c 同上$v变化 ,$v = &$data[1],所以$data[1] = c,循环体内$v= &$data[2] = c===>b,c,c