PHP 类成员属性的析构顺序

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2014/10/01/destruct-order-of-object-properties-in-php/

接前文:PHP 类静态成员的奇怪析构现象

前文提到:多个类的静态成员析构顺序与构造顺序一致,本文演示另一种类似情况。

先看一段正常代码:

 1<?php
 2class Vessel {
 3	public $b;
 4	public $a; 
 5	public function __construct() {
 6		echo __METHOD__.'<br>';
 7	}
 8	public function __destruct() {
 9		echo __METHOD__.'<br>';
10	}
11}
12
13class A {
14	public function __construct() {
15		echo __METHOD__.'<br>';
16	}
17	public function __destruct() {
18		echo __METHOD__.'<br>';
19	}
20}
21
22class B {
23	public function __construct() {
24		echo __METHOD__.'<br>';
25	}
26	public function __destruct() {
27		echo __METHOD__.'<br>';
28	}
29}
30$v = new Vessel();
31$v->a = new A;
32$v->b = new B();

这个看起来是正常的,是的,因为A先构造,而在B之后析构,符合先构造后析构的栈原则

但是看看下面的一段代码:

 1<?php
 2
 3class Vessel {
 4	public $a; /* Don't you find any differences? */
 5	public $b;
 6	public function __construct() {
 7		echo __METHOD__.'<br>';
 8	}
 9	public function __destruct() {
10		echo __METHOD__.'<br>';
11	}
12}
13
14class A {
15	public function __construct() {
16		echo __METHOD__.'<br>';
17	}
18	public function __destruct() {
19		echo __METHOD__.'<br>';
20	}
21}
22
23class B {
24	public function __construct() {
25		echo __METHOD__.'<br>';
26	}
27	public function __destruct() {
28		echo __METHOD__.'<br>';
29	}
30}
31$v = new Vessel();
32$v->a = new A;
33$v->b = new B();

问题出现了!

一个类的成员变量的析构顺序也和其在类中的定义顺序一致。

所以,如果在一个对象里添加其未定义的成员,析构顺序也和上面的一样,如下:

 1<?php
 2
 3class Vessel {
 4	/* None of members. */
 5
 6	public function __construct() {
 7		echo __METHOD__.'<br>';
 8	}
 9	public function __destruct() {
10		echo __METHOD__.'<br>';
11	}
12}
13
14class A {
15	public function __construct() {
16		echo __METHOD__.'<br>';
17	}
18	public function __destruct() {
19		echo __METHOD__.'<br>';
20	}
21}
22
23class B {
24	public function __construct() {
25		echo __METHOD__.'<br>';
26	}
27	public function __destruct() {
28		echo __METHOD__.'<br>';
29	}
30}
31$v = new Vessel();
32$v->a = new A;
33$v->b = new B();
comments powered by Disqus