析构方法
PHP5提供了一个与__construct()方法对应的方法__destruct()。它只在对象被垃圾收集器收集前(即对象从内存中删除之前)自动调用。你可以利用这个方法进行最后必要的清理工作。
class Person
{
private $name;
private $age;
private $id;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function setId($id)
{
$this->id = $id;
}
public function __destruct()
{
if (!empty($this->id)) {
//保存Person数据
print "saving person\n";
}
}
}
这样无论Person对象何时从内存中删除,__destruct()方法都会被调用。当对一个对象调用unset()函数时,或者进程中不再引用某个对象时,对象就被销毁了。
使用__clone()复制对象
在PHP中,对象的赋值和传递都是通过引用进行的,但有时候我们也需要获得一个对象的副本,而不是引用。PHP提供了clone关键字来达到这个目的。在对象调用clone时,我们可以控制复制什么。我们可以通过实现一个特殊的方法__clone()来达到这个目的(注意所有以两个下划线开头的方法都是PHP内置的方法)。当在一个对象上调用clone关键字时,其方法就会被自动调用。
class Person
{
private $name;
private $age;
private $id;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function setId($id)
{
$this->id = $id;
}
public function __clone()
{
$this->id = 0;
}
}
这样的浅复制(shallow copy)可以保证所有基本数据类型的属性被完全复制。在复制对象属性时只复制引用,这可能不是你所期望的。如果不希望对象属性在被复制后被共享,那么可以显式地在__clone()方法中复制指向的对象。
class Account
{
public $balance;
public function __construct($balance)
{
$this->balance = $balance;
}
}
class Person
{
private $name;
private $age;
private $id;
private $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;
$this->account = clone $this->account;
}
}
$person = new Person("bob", 44, new Account(200));
$person = setId(343);
$person2 = clone $person;