Magic Methods of PHP (2)
技术交流
@ 2009年02月09日
关于 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;