Bun Wong's Blog

专注于 Web 应用程序开发

Magic Methods of PHP (2)

关于 Constructors and Destructors

个人觉得构造函数和析构函数没有啥特别值得说的,都是一些容易遗漏的地方:

  • 子类的构造/析构函数默认不会调用父类的,需要显式地调用 parent::__construct()parent::__destruct()
  • 总是需要 public,若为 private 或 protected 则 Fatal error
  • PHP 5 之前,不存在该两种 magic methods,为了兼容构造函数,可以用一个与类名相同的成员函数来取代

class Example1
{
    public function __construct($param)
    {
    }
    
    public function Example1($param)
    {
        $this->__construct($param);
    }
}

  • 调用 __destruct() 是对象不再被引用(显式 unset)或当脚本运行结束时调用,因此仅 new 对象而不赋对象给一个变量,将马上调用 __destruct()
  • 关于 desctructor 执行顺序,符合栈的 LIFO 原则,即创建实例的顺序是 A -> B -> C,则顺序为 C -> B -> A 地调用其对象内的 __destruct()。有下面的例外情况,顺序是 B -> A -> C,不明确其原因,我猜测是 C 为完成构造因此并未入栈,大家知道原因可以留言或 Email 给我哦 :)

class A
{
    public function __destruct()
    {
        echo 'A';
    }
}

class B
{
    public function __destruct()
    {
        echo 'B';
    }
}

class C
{
    public function __construct()
    {
        exit;  // terminate here
    }
    public function __destruct()
    {
        echo 'C';
    }
}

$a new A;
$b new B;
$c new C;

000000

支持

鸡蛋

路过

雷人

我晕

好帅

留言 (1)

  • 番仔

    February 9th 2009 • 17:09

    木办法..又要来一趟

发表留言

Google Analytics

最近一个月访问数:544