构造扩展具有自己的构造函数的超类的对象



我不确定该怎么称呼它,所以请随意编辑标题。

我正在尝试创建自己的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)

最新更新