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

时间:2013-12-29 13:58:49

标签: php constructor polymorphism

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

我正在尝试创建自己的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传递给构造函数?

1 个答案:

答案 0 :(得分:1)

你拥有所有代码,为什么不尝试呢?

<?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)