Fenying

Angus’ Home.


01 Oct 2014

PHP 类成员属性的析构顺序

该文章迁移自作者的旧博客站点。
源地址: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();
该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2014/10/01/destruct-order-of-object-properties-in-php/

comments powered by Disqus