PHP 面向对象基础:析构方法 2 个改进

什么是析构方法?

析构方法是 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.
本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!