2

现在,我正在开发两个用于与 MySQL 数据库交互的类——一个扩展了另一个。他们来了:

class DB_MySQL {

    protected $dbuser;
    protected $dbpass;
    protected $dbhost;
    protected $dbname;
    protected $dbh; // Database connection handle

    public function __construct($dbuser, $dbpass, $dbhost, $dbname)
    {
        $this->dbuser = $dbuser;
        $this->dbpass = $$dbpass;
        $this->dbhost = $dbhost;
        $this->dbname = $dbname;
    }

    //Used to create connections - almost always called by execute()
    protected function connect()
    {
        try
        {
            $this->dbh = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
        }
        catch(PDOException $e)
        {
            print "Error!: ".$e->getMessage()."<br/>";
            die();
        }
    }

和子类:

class CheckOut extends DB_MySQL{

     function __construct() 
    {
        parent::__construct();
    }
}

我刚开始写它们,所以对它们来说还没有“肉”。如果有人看到任何重大问题或任何建议,请不要犹豫指出。

不过,我的问题是子构造函数将如何与父构造函数交互。我的计划是简单地创建一个 CheckOut 对象而不启动父对象。可以看出,我的父构造函数有四个值。那么,我是否必须在子构造函数中重新定义这些值?说清楚,我的意思是:

class CheckOut extends DB_MySQL{

     function __construct($dbuser, $dbpass, $dbhost, $dbname) 
    {
        parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
    }
}

当然还要定义这些变量。或者我可以在创建对象时添加这些值并将其隐式传递吗?

任何帮助表示赞赏。

4

2 回答 2

3

如果子类的构造函数不做任何其他事情,那么你可以省略构造函数。

只需以下即可:

class CheckOut extends DB_MySQL{
}

但是如果子类的构造函数需要做一些其他的工作,是的,你需要做:

class CheckOut extends DB_MySQL{

    public function __construct($dbuser, $dbpass, $dbhost, $dbname) 
    {
        parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
        do_some_other_work();
    }
}

使用时,双方都需要调用:

$checkout = new CheckOut($dbuser, $dbpass, $dbhost, $dbname);
于 2012-09-17T04:33:49.293 回答
1

您在问题中提供的代码是在这种情况下执行此操作的正确方法(假设您想在构造函数中执行其他操作):

class CheckOut extends DB_MySQL{
    function __construct($dbuser, $dbpass, $dbhost, $dbname) 
    {
        parent::__construct($dbuser, $dbpass, $dbhost, $dbname);
    }
}

否则(如果你不想在构造函数中做任何其他事情)你不需要重写构造函数。

class CheckOut extends DB_MySQL{

    // no constructor, Parent's constructor is called by default

}
于 2012-09-17T04:34:13.183 回答