php深层理论知识太浅,php之对象浅复制、深复制

变量有值传递和引用传递,其实,对象也类似如此,所以,对象有浅复制和深复制之说。

浅复制

class cat{

public $name;

public $age;

public function __construct($name,$age){

$this->name = $name;

$this->age = $age;

}

}

$obj1 = new cat('dog',12);

$obj2 = $obj1;

var_dump($obj1);

echo "
";

echo "
";

var_dump($obj2);

?>

我们把

math?formula=obj1%20%E8%B5%8B%E5%80%BC%E7%BB%99%E4%BA%86obj2,这时输出如下

c48cec77068e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

可以看到他们有共同的数据,name全部变成了dog,也就是说明了,它们公用了一个空间,可以看成

math?formula=obj2%20%E6%98%AFobj1的一个引用,所以这是一个浅复制。

深复制:

通过一个clone关键词来实现,如下:

class cat{

public $name;

public $age;

public function __construct($name,$age){

$this->name = $name;

$this->age = $age;

}

}

$obj1 = new cat('cat',12);

$obj2 = clone $obj1;

$obj2->name = 'dog';

var_dump($obj1);

echo "
";

echo "
";

var_dump($obj2);

?>

如下显示

c48cec77068e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

可以看出,

math?formula=obj2%E5%AE%8C%E5%85%A8%E6%88%90%E4%BA%86obj1的复制,而不会影响到原先 $obj1的值,这就是一个深复制。

注意:

1、当对象中的属性是reference时,再对对象使用clone复制时,不会产生作用,还是浅复制

来看一个例子,如下:

class cat{

public $name;

}

$name = 'cat';

$obj1 = new cat();

$obj1->name = &$name; //引用

$obj2 = clone $obj1;

$obj2->name = 'dog';

var_dump($obj1);

echo "
";

echo "
";

var_dump($obj2);

?>

输入如下

c48cec77068e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

__clone

__clone是php提供实现深复制的一个魔术方法,当对象通过clone进行复制时,会自动调用__clone魔术方法,看以下两个例子:

class cat{

public $name;

public $age;

public function __construct($name,$age){

$this->name = $name;

$this->age = $age;

}

}

class dog{

public $name;

public $obj;

}

$obj1 = new dog();

$obj1->name = "dog";

$obj1->obj = new cat('cat',15);

$obj2 = clone $obj1;

var_dump($obj1);

echo "
";

echo "
";

echo "
";

var_dump($obj2);

echo "
";

echo "
";

echo "
";

$obj2->name = 'row';

$obj2->obj->age = 10;

var_dump($obj1);

echo "
";

echo "
";

echo "
";

var_dump($obj2);

echo "
";

echo "
";

echo "
";

?>

输出如下

c48cec77068e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

当通过 clone 把

math?formula=obj1%20%E5%A4%8D%E5%88%B6%E7%BB%99obj2时,对

math?formula=obj2%E7%9A%84obj%E4%B8%AD%E7%9A%84%20age%E8%BF%9B%E8%A1%8C%E4%BF%AE%E6%94%B9%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%8F%91%E7%8E%B0%EF%BC%8Cobj1和$obj2的数据被同时修改了,clone并没有实现真正的深复制。这时可以通过__clone来实现深复制,如下:

public $name;

public $age;

public function __construct($name,$age){

$this->name = $name;

$this->age = $age;

}

}

class dog{

public $name;

public $obj;

public function __clone(){//实现深复制

$this->obj = clone $this->obj;

}

}

$obj1 = new dog();

$obj1->name = "dog";

$obj1->obj = new cat('cat',15);

$obj2 = clone $obj1;

var_dump($obj1);

echo "
";

echo "
";

echo "
";

var_dump($obj2);

echo "
";

echo "
";

echo "
";

$obj2->name = 'row';

$obj2->obj->age = 10;

var_dump($obj1);

echo "
";

echo "
";

echo "
";

var_dump($obj2);

echo "
";

echo "
";

echo "
";

?>

输出如下

c48cec77068e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值