class obj
{
}
$obj1 = new obj();//实例化对象
$obj2 = $obj1;//赋值新对象
$obj1->name = "test";//改变老对象的成员变量属性
var_dump($obj1);
var_dump($obj2);
打印结果:
object(obj)#1 (1) { ["name"]=> string(4) "test" }
object(obj)#1 (1) { ["name"]=> string(4) "test" }
改变复制新对象,查看实例化对象的结果
$obj2->name = "name";//改变新对象的成员变量属性
var_dump($obj1);
var_dump($obj2);
打印结果
object(obj)#1 (1) { ["name"]=> string(4) "name" }
object(obj)#1 (1) { ["name"]=> string(4) "name" }
分析
可以看出来当实例化对象赋值给其他变量时,改变实例化对象和改变赋值对象,另一方都会随之改变
那么如何在实际工作中如何做到赋值对象之后,改变一方而不改变另一方呢?
克隆
$obj3 = clone $obj1;
$obj1->name = "clone";
var_dump($obj1);
var_dump($obj3);
打印结果
object(obj)#1 (1) { ["name"]=> string(5) "clone" }
object(obj)#2 (1) { ["name"]=> string(4) "name" }
可以看到 $obj3 不会随着 $obj1 的改变而改变
该结论可以用在 laravel 的链式操作数据库中