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