2

現在、MySQL データベースと対話するための 2 つのクラスを開発しています。一方は他方を拡張しています。どうぞ:

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 オブジェクトを作成することです。ご覧のとおり、私の親コンストラクターは 4 つの値を取ります。では、子コンストラクターでこれらの値を再定義する必要がありますか? 明確にするために、私は意味します:

class CheckOut extends DB_MySQL{

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

もちろん、それらの変数を定義します。または、オブジェクトを作成するときにこれらの値を追加して、暗黙的に渡すことはできますか?

どんな助けでも大歓迎です。

4

2 に答える 2

3

子クラスのコンストラクターが他に何もしない場合は、コンストラクターを省略できます。

以下だけでOKです。

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 に答える