【问题标题】:Constructing objects that extends a super class that has its own constructor构造扩展具有自己构造函数的超类的对象
【发布时间】:2013-12-29 13:58:48
【问题描述】:

我不确定如何称呼它,所以请随意编辑标题。

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

【问题讨论】:

  • 您还必须将$db 传递给您的Group 构造函数并调用super.__construct($db)

标签: php constructor polymorphism


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多