PHP親呼び出し子メソッド,CodeIgniterでのDBの継承関係
1870 ワード
まず、コードをいくつか見てみましょう.
これらの行のコードにはエラーはありません.親クラスで子クラスを呼び出す方法で、子クラスがインスタンス化された後に正常に動作します.CIのDB部分は,この方式を用いてデータベース操作をカプセル化している.
CIのDB関数の書き方は、
そして
そうでなければ
最後にrequireの対応するデータベースのdriver、例えばmysqlで、
これらのクラスでは、
DB関数には次のように書かれています.
$paramsは
次に、自動初期化が行われているかどうかを確認します.
一方、initializeメソッドは
例えばmysqlの実装は
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);
}