我不确定该怎么称呼它,所以请随意编辑标题。
我正在尝试创建自己的API。 在此API中,有一些对象,这些对象都扩展了超类ApiObject
:
class ApiObject {
protected $sqltemplate;
public function __construct($db){
$this->sqltemplate = new sqlTemplates($db);
}
protected function getTemplate(){
return $this->sqltemplate;
}
}
现在,扩展此类的对象示例如下:
class Group extends ApiObject {
public function __construct(){
}
public function findByUserId(){
}
public function findByTeam(){
}
现在我的问题如下:
当我构造一种类型的Group
对象时,ApiObject
的构造器总是被调用吗? 如果是这样,它如何将参数$db
传递给构造函数?
您拥有所有代码,为什么不尝试一下呢?
<?php
class ApiObject {
public function __construct($db){
echo __METHOD__, "($db)n";
}
}
class Group extends ApiObject {
public function __construct(){
echo __METHOD__, "n";
}
}
new Group;
输出
Group::__construct
这表明不会自动调用父对象的构造函数。您必须通过 parent::__construct($db)
执行此操作,并将 $db
参数添加到第二个构造函数中。
<?php
class ApiObject {
public function __construct($db){
echo __METHOD__, "($db)n";
}
}
class Group extends ApiObject {
public function __construct($db){
echo __METHOD__, "n";
parent::__construct($db);
}
}
new Group("db");
输出
Group::__construct
ApiObject::__construct(db)
为了更好地理解:Group::__construct
覆盖父构造函数,这就是您必须手动调用它的原因。如果未指定构造函数,则会自动调用父构造函数。例:
<?php
class ApiObject {
public function __construct($db){
echo __METHOD__, "($db)n";
}
}
class Group extends ApiObject {
}
new Group("db");
输出
ApiObject::__construct(db)