Superclass的构造函数是在PHP中的子构造函数中运行的吗?

时间:2009-04-10 19:11:01

标签: php oop

如果我有这门课程:

<?php
class Model
{
    var $db;

    function Model()
    {
        $this->db=new Db_Class();
    }
}
?>

和扩展父类的第二个类:

<?php
class LessonModel extends Model
{

    public function LessonModel()
    {
        //code here
    }

    public function getTitle($id)
    {
       $this->db->setTable('myTable');
       return $this->db->get('title',$id);
    }
}
?>

是否可以安全地假设$LessonModel->db字段已由父Model类的构造函数实例化,或者我是否需要使用parent::Model();之类的东西手动运行它?

3 个答案:

答案 0 :(得分:10)

您不能假设已经调用了父构造函数,因为您已在子类中重写了它。您需要按照建议拨打parent::Model()。如果你改变了你继承的课程,你显然需要改变它。

如果您使用的是PHP5,那么您可以为构造函数__construct()命名。这样做的好处是可以通过在任何派生类中执行parent::__construct()来轻松调用父构造函数,而无需指定父类名。然后,您可以重新安排类的继承,减少麻烦,减少引入模糊错误的危险。

答案 1 :(得分:0)

在给定的示例中,您可以假设。

但是,如果您的子类定义了构造函数,PHP将不会隐式调用它的父构造函数。

为此,请致电:

parent::__construct();

答案 2 :(得分:0)

有一种廉价的方法来绕过必须调用父构造函数。

在基类中创建一个空的init()方法。在基类构造函数中调用$ this-&gt; init()。

如果要在创建类时运行代码,所有子类都可以实现init()。