php对象引用

直接上代码!如下:

class User  {
 public $name = "hello";
 }
$u1 = new User();
$u2 = $u1; 
$u3 = &$u1;
$u1->name = "world";
$u1 = null;
var_dump($u1,$u2,$u3);

输出结果如下:

  1. NULL

  2. class User#1 (1) { public $name =>string(5) "world"}

  3. NULL

请问下,这里的$u2 = $u1;是怎么执行的?改变$u1对象的属性,$u2会跟着改变。但是将$u1赋NULL值却不影响$u2。求助一下!谢谢!

阅读 3.8k
4 个回答

php就是这样定义的,对象类型的变量,不存储对象内容,仅仅存储了一个指向真正的变量内容的引用,
对于一个对象变量来说,=意味着浅拷贝,仅仅添加一个对象内容的引用,不论前边是否有&
如果你要复制一个全新的对象,申请全新的内存,要使用clone
$u2=clone $u1;

至于null的问题,也就容易理解了:
$u2=$u1给u2添加的是指向真正变量的引用而不是指向u1的。你把$u1重新赋值为null,$u2的引用并没有影响。

输出结果 原因
$u1 = null 因为在最后一步你讲null的变量赋为null
$u2 = object 因为第二步你将是实列化的$u1赋给它了,就相当于它这个容器里现在装着object,这里你可以理解成它克隆了一个一摸一样的$u1
$u3 = null 因为$u3时按引用传递,它等于$u1的内存地址,$u1改变了它也就变了

当然以上只是个人观点,相关流程术语不是很精通,学识不够还望大佬能及时指正

当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

参考资料:PHP的对象和引用赋值

$u1创建对象赋值后,就储存着对象的引用。

$u2赋值后,储存着和$u1一样的内容,也就是对象的引用。虽然他们的内容一样,但却是完全不相干的两个变量。所以当给$u1赋值时不会影响到$u2。但是通过$u1修改对象的属性可以从$u2反映出来。

而$u3是对$u1的引用,换句话说,$u3就是$u1,就好像一个人在不同的地方用不同的名字,但还是同一个人。所以对$u1的修改也会影响到$u3 。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题