PHP 面向对象基础:析构方法
什么是析构方法?
析构方法是 PHP 魔术方法 的一种,会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
class Parents
{
public $father;
public $mother;
public function __construct($fName, $mName)
{
$this->father = $fName;
$this->mother = $mName;
}
public function getName()
{
echo 'Father\'name is ' . $this->father . '.<br />';
echo 'Monter\'name is ' . $this->mother . '.<br />';
}
public function __destruct()
{
print "Destroying " . __class__ . ".<br />";
}
}
$parents1 = new Parents('David', 'Lily');
$parents2 = new Parents('Bob', 'Rose');
$parents1->getName();
// Father'name is David.
// Monter'name is Lily.
$parents2->getName();
// Father'name is Bob.
// Monter'name is Rose.
当对象的所有代码被执行完毕,对这个对象的引用也就没有了。
Destroying Parents.
Destroying Parents.
如果以上代码在运行时提前销毁对象,不能够继续对对象的引用比如调用方法。
$parents1 = new Parents('David', 'Lily');
$parents1 = null;
$parents1->getName();
Fatal error: Uncaught Error: Call to a member function getName() on null
和构造方法一样,父类的析构方法不会被引擎暗中调用。要执行父类的析构方法,必须在子类的析构方法体中显式调用 parent::__destruct()。此外也和构造方法一样,子类如果自己没有定义析构方法则会继承父类的。
class Parents
{
public function __destruct()
{
print "Destroying " . __class__ . ".<br />";
}
}
class Son extends Parents
{
public function __destruct()
{
parent::__destruct();
print "Destroying " . __class__ . ".<br />";
}
}
class Daughter extends Parents
{
public function __destruct()
{
}
}
$parents = new Parents();
// Destroying Parents.
$son = new Son();
// Destroying Parents.
// Destroying Son.
$daughter = new Parents();
// Destroying Parents.