对象的赋值(unset和重新赋一个值对内存来说是不一样的)

情景一:


上图中$p2 = $p1;执行的是,对象标识符的传递。($p1 = 'a';是$p1这个变量指向‘a’的地址,$p1在内存中是不占空间的,当调用$p1的时候,他就会顺着$p1指向的地址找到‘a’,从而操作'a',而&$p1是指取$p1这个变量指向的地址,也就是'a'的地址)也就是说变量名并不是存储着某个内容的内存地址的,它只是指向了一块内存地址空间,但是调用变量名时却可以顺着它指向的地址找到那个内存的内容。加&就可以取出指向的内存地址。
当对象1被赋值给赋值给对象2的时候,其实是对象标识符的传递。
每执行一条代码就把代码区的代码加载到栈区来执行。
1、所有代码必须加载到内存才能执行
2、当我们把一个对象赋给另外一个变量时,也是值拷贝,但是拷贝的不是数据本身,而是对象标识符。





情景二:

$p2 = &$p1; 相当于p2和p1指向了相同的对象描述符。这个时候如果unset($p1),则只是销毁了$p1对#1的指向,销毁了$p1,而不会销毁#1,所以$p2对象还是有的。$p1和$p2存放的是#1这个对象标识符的内存地址。而当使用$p2 = 'abc'的话,则是把$p2指向的那段内存空间的内容#2给改了,所以这个时候输出$p1->name,是会报错的。$p2 = null和$p2 = 'abc'效果是一样的。

<?php  
class Person{
	public $name;
}
$p1 = new Person;
$p1->name = 'aa';
$p2 = &$p1;
//$p2 = 'abc';
unset($p2);
echo $p1->name;
?>

注意以上两段代码的区别。
加载类里面的方法到栈区

猜你喜欢

转载自blog.csdn.net/wangyingjie290107/article/details/79356418