PHP親呼び出し子メソッド,CodeIgniterでのDBの継承関係


まず、コードをいくつか見てみましょう.

 class A {
    private $b;
    function __construct($a){
        $this->b = $a;
    }
    function func1(){
        var_dump($this->b);
    }
    function func2(){
        $this->funcb();
    }
}

class B extends A {
    function funcb(){
        var_dump("b");
    }
}

$a = new B('a');
$a->func1();
$a->func2();

これらの行のコードにはエラーはありません.親クラスで子クラスを呼び出す方法で、子クラスがインスタンス化された後に正常に動作します.CIのDB部分は,この方式を用いてデータベース操作をカプセル化している.
CIのDB関数の書き方は、CI_DB_driverというベースクラスを先にロードし、active recordがオンになっているかどうかを確認し、オンになっている場合は

class CI_DB_active_record extends CI_DB_driver

そして

class CI_DB extends CI_DB_active_record

そうでなければ

class CI_DB extends CI_DB_driver

最後にrequireの対応するデータベースのdriver、例えばmysqlで、

CI_DB_mysql_driver extends CI_DB

これらのクラスでは、CI_DB_driverのみが構造関数を有し、1つのパラメータを有する.
DB関数には次のように書かれています.

$driver = 'CI_DB_'.$params['dbdriver'].'_driver';
$DB = new $driver($params);

$paramsはCI_DB_driverに伝達される構造関数である.
次に、自動初期化が行われているかどうかを確認します.

$DB->initialize();

一方、initializeメソッドはCI_DB_driverクラスにあり、このメソッドはサブクラスのメソッドを呼び出します.

$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();
db_connect法およびdb_pconnect法は、マッピングデータベースdriverにおいて実装される.
例えばmysqlの実装はCI_DB_mysql_driverクラスにある.

function db_connect()
{
    if ($this->port != '')
    {
        $this->hostname .= ':'.$this->port;
    }
    return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
}