直接上代码!如下:
class User {
public $name = "hello";
}
$u1 = new User();
$u2 = $u1;
$u3 = &$u1;
$u1->name = "world";
$u1 = null;
var_dump($u1,$u2,$u3);
输出结果如下:
NULL
class User#1 (1) { public $name =>string(5) "world"}
NULL
请问下,这里的$u2 = $u1;是怎么执行的?改变$u1对象的属性,$u2会跟着改变。但是将$u1赋NULL值却不影响$u2。求助一下!谢谢!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
php就是这样定义的,对象类型的变量,不存储对象内容,仅仅存储了一个指向真正的变量内容的引用,
对于一个对象变量来说,=意味着浅拷贝,仅仅添加一个对象内容的引用,不论前边是否有&
如果你要复制一个全新的对象,申请全新的内存,要使用clone
$u2=clone $u1;
至于null的问题,也就容易理解了:
$u2=$u1给u2添加的是指向真正变量的引用而不是指向u1的。你把$u1重新赋值为null,$u2的引用并没有影响。
$u1 = nullnull的变量赋为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 。