PHP|关于对象复制的一些事
先看对象复制的代码
class CopyMe{}$first = new CopyMe();$second = $first;
在PHP5及以后的版本,$first & $second指向同一个对象。
在PHP中,对象的赋值和传递都是通过引用进行的。
当我们需要一个对象的副本时,可以这么做:
class CopyMe{}$first = new CopyMe();$second = clone $first;
通过clone关键字,使用值复制方式新生成一个对象。
但是这有一个问题,对象中的某些数据,比如id,我不想是一样的。但是clone是做不到的。
这时我们可以通过实现一个特殊的方法clone()来达到这个目的。当一个对象调用clone关键字时,其clone()方法就会被自动调用。
class Person{ public private $id; public function __construct() {} public function setId($id) { $this->id = $id; } public function __clone() { $this->id = 0; }}$person = new Person();$person->setId(343);$person2 = clone $person;
这样的赋值属于浅复制(shallow copy),可以保证所有基本数据类型的属性被完全复制。
如果我们不希望对象的属性的属性被共享,例如:
class Account{ public $balance; public function __construct($balance) { $this->balance = $balance; }}class Person{ private $name; private $age; private $id; public $account; public function __construct($name, $age, Account $account) { $this->name = $name; $this->age = $age; $this->account = $account; } public function setId($id) { $this->id = $id; } public function __clone() { $this->id = 0; }}$person = new Person('bob', 43, new Account(200));$person->setId(433);$person2 = clone $person;$person->account->balance += 10;print $person2->account->balance;
得到的结果: 210
实际上我并不想让$person2的账户价格受到另一个对象的影响。
可以显式的在__clone方法中复制指向的对象。
function __clone() { $this->id = 0; $this->account = clone $this->account;}
关键字:php, oop, clone, #this-#
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!