当我创建一个超类型并扩展它时,超类型的构造函数会发生什么?

时间:2011-11-17 05:29:30

标签: php oop class inheritance

我可以扩展sueprtype的构造函数吗?文档没有说明扩展功能。

我想创建一个在初始化子类型时连接到数据库的类,但我不想为每个子类型编写连接代码。所以我想在超类型的构造函数中执行它,但我也希望子类型具有构造函数。

4 个答案:

答案 0 :(得分:1)

方法不会“扩展”本身;课程得到扩展。这些类的方法仍然存在,如果它们的范围适当,可以调用它们。

要更直接地回答您的问题,您可以调用parent::__construct()来调用超类的__construct()方法。有关详细信息,请参阅the PHP documentation on constructors and destructors

答案 1 :(得分:1)

来自php.net

  

注意:如果子类,则不会隐式调用父构造函数   定义构造函数。为了运行父构造函数,调用   

是子构造函数中的parent :: __ construct()

http://www.php.net/manual/en/language.oop5.decon.php

所以你要做的是连接超类构造函数中的数据库。然后创建子类构造函数并调用parent::__construct()

但是,明确连接可能会更好。在基类中调用$this->connect(),它将在父类中定义。

答案 2 :(得分:1)

正如您可以使用parent::methodName()来调用函数的父版本,因此您可以调用self::methodName()来调用方法的当前类实现。

此链接可能对您有所帮助

http://www.php.net/manual/en/language.oop5.basic.php#102275

答案 3 :(得分:1)

是的,您可以像类中的任何其他方法一样覆盖构造函数:

<?php
class DbSuper {
    function __construct() {
        echo "db connection using super class<br/>";
    }
}

class DbSub extends DbSuper {
    function __construct() {
        echo "db connection using sub class<br/>";
    }
}

class DbSubNoConstr extends DbSuper {

}

class DbSubBothConstr extends DbSuper {
    function __construct() {
        echo "execute subclass code<br/>";
        parent::__construct();
    }

}

new DbSub(); //prints db connection using sub class
new DbSubNoConstr(); // prints db connection using super class
new DbSubBothConstr(); // prints execute subclass code db connection using super class
?>