如果我有这门课程:
<?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();
之类的东西手动运行它?
答案 0 :(得分:10)
您不能假设已经调用了父构造函数,因为您已在子类中重写了它。您需要按照建议拨打parent::Model()
。如果你改变了你继承的课程,你显然需要改变它。
如果您使用的是PHP5,那么您可以为构造函数__construct()
命名。这样做的好处是可以通过在任何派生类中执行parent::__construct()
来轻松调用父构造函数,而无需指定父类名。然后,您可以重新安排类的继承,减少麻烦,减少引入模糊错误的危险。
答案 1 :(得分:0)
在给定的示例中,您可以假设。
但是,如果您的子类定义了构造函数,PHP将不会隐式调用它的父构造函数。
为此,请致电:
parent::__construct();
答案 2 :(得分:0)
有一种廉价的方法来绕过必须调用父构造函数。
在基类中创建一个空的init()方法。在基类构造函数中调用$ this-&gt; init()。
如果要在创建类时运行代码,所有子类都可以实现init()。