变量
$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]($v指向的是$data[0]的指针地址,如果再循环时$v变化的话会直接影响$data[0]的值) ==> 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
foreach ($arr2 as $key=>$val) { //给$val赋值,执行到这里会改变上个循环中的值
$val = &$arr2[$key];
var_dump($arr2);
echo "<br>";
}