自php5起,有了构造函数与析构函数。
这使得php更富有面向对象的魅力了。
在php4时,构造函数用的是与类同名的函数来进行构造这个动作。
例如:
将以上代码保存为myclass.php,运行后,会打印出 this is myclass字样。这是php4的构造函数(当然,为了兼容,php5也可以这样写)。
在php5里,有了专门的构造和析构函数。__construct()和__destruct() 。再重新改写这个myclass.php。
保存以后发现打印出了"constructor destroying"。说明构造和析构的确发生了。
目前为止,没有任何问题。在php5的手册里,对于使用__construct还有段说明。如下:
为了实现向后兼容性(指php 4),如果 php 5 在类中找不到 __construct() 函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法,但它却又不是构造函数。
再来看一种情况,当一个派生类继承了基类并且这两个类都存在构造和析构函数的时候会出现什么眼的状况呢?
php 5对此的处理手段是: 隐藏基类的构造和析构!
代码:
<?php
/*
* myclass.php
*/
class baseclass {
function __construct() {
print "baseclass:n constructor ";
}
function __destruct() {
print "baseclass:n destroying ";
}
}
class subclass extends baseclass {
function __construct() {
print "subclass:n constructor ";
}
function __destruct() {
print "subclass:n destroying ";
}
}
$obj = new subclass();
?>
保存运行后,结果打印:subclass: constructor subclass: destroying
可以看到,基类的构造与析构并没有发生。
这不得不让人费解,为什么php5会采取这种的机制呢?
c++的构造与析构的过程是:基类构造->派生类构造->派生类析构->基类析构。这才是成熟的机制。为什么php 5 会标新立异?
很显然,这种做法并不十分的明智。
翻看php手册找到一种说法:
php 4 不会从派生类的构造函数中自动调用基类的构造函数。恰当地逐次调用上一级的构造函数是用户的责任。 (php 4)
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。 (php 5)
可惜这两种说法并不足以令人信服。既然已经存在了构造,为何还得用手工调用?