代码之家  ›  专栏  ›  技术社区  ›  Ali

超类的构造函数是否在PHP的子构造函数中运行?

  •  0
  • Ali  · 技术社区  · 16 年前

    如果我有这门课:

    <?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 回复  |  直到 13 年前
        1
  •  10
  •   Tom Haigh    16 年前

    不能假定已调用父构造函数,因为您已在子类中重写了此构造函数。你需要打电话 parent::Model() 如你所建议的。如果您更改了从中继承的类,显然需要更改它。

    如果您使用的是php5,那么就可以命名构造函数 __construct() . 这样做的好处是,您可以通过执行以下操作轻松地调用父构造函数 parent::__construct() 在没有指定父类名称的任何派生类中。然后,您可以用更少的麻烦和引入不明显的bug的风险来重新安排类的继承。

        2
  •  0
  •   Mike Hordecki    16 年前

    在给定的示例中,您可以假定这一点。

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

    为此,请致电:

    parent::__construct();
    
        3
  •  0
  •   Matt    16 年前

    有一种廉价的方法可以绕过调用父构造函数。

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

    如果所有子类希望在创建类时运行代码,那么它们都可以实现init()。