php __construct 构造函数用法 转

转自 http://ribeter267.blog.163.com/

在PHP4的时候出现了构造函数,继而在PHP5内又添增了析构。这使得PHP更富有面向对象的魅力了。在PHP4时,构造函数用的是与类同名的函数来进行构造这个动作。例如:

<?php
/** myClass.php*/
class myClass
{
    function myClass()
    {
        print "This is myClass\n";
    }
}

//创建一个新的实例
$obj = new myClass();
?>

将以上代码保存为myClass.php,运行后,会打印出 This is myClass 字样。这是php4的构造函数(当然,为了兼容,php5也可以这样写)。

在php5里,有了专门的构造和析构函数。__construct()和__destruct() 。再重新改写这个myClass.php。

<?php
/** myClass.php*/
class myClass
{
    function __construct()
    {
        print "constructor\n";
    }
    function __destruct()
    {
        print "destroying\n";
    }
}

//创建一个新的实例
$obj = new myClass();
?>

保存以后发现打印出了”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)

posted @ 2011-04-02 11:45  ndxsdhy  阅读(14877)  评论(0编辑  收藏  举报