PHP 类成员属性的析构顺序
该文章迁移自作者的旧博客站点。
源地址:http://fenying.blog.163.com/blog/static/10205599320149104519638/。
源地址:http://fenying.blog.163.com/blog/static/10205599320149104519638/。
接前文:PHP 类静态成员的奇怪析构现象。
前文提到:多个类的静态成员析构顺序与构造顺序一致,本文演示另一种类似情况。
先看一段正常代码:
<?php
class Vessel {
public $b;
public $a;
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
class A {
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
class B {
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
$v = new Vessel();
$v->a = new A;
$v->b = new B();
这个看起来是正常的,是的,因为A先构造,而在B之后析构,符合先构造后析构的栈原则。
但是看看下面的一段代码:
<?php
class Vessel {
public $a; /* Don't you find any differences? */
public $b;
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
class A {
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
class B {
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
$v = new Vessel();
$v->a = new A;
$v->b = new B();
问题出现了!
一个类的成员变量的析构顺序也和其在类中的定义顺序一致。
所以,如果在一个对象里添加其未定义的成员,析构顺序也和上面的一样,如下:
<?php
class Vessel {
/* None of members. */
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
class A {
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
class B {
public function __construct() {
echo __METHOD__.'<br>';
}
public function __destruct() {
echo __METHOD__.'<br>';
}
}
$v = new Vessel();
$v->a = new A;
$v->b = new B();
comments powered by Disqus