MDB2 はモジュール化を意識して設計されています。 基本機能であるクエリの実行や結果セットの読み込み以外の機能は、 モジュールで提供しています。現在使用可能なモジュールは以下のとおりです。
モジュールを読み込むには loadModule() メソッドを使用します。 このメソッドはモジュールのインスタンスを返しますが、 それだけでなくそのインスタンスをプロパティとして保持します。 プロパティ名は、最初のパラメータで指定したモジュール名を小文字にしたものか、 あるいはオプションで指定した 2 番目のパラメータと同じものになります。 オプションの 3 番目のパラメータを使用すると、 特定の RDBMS に依存するモジュール (例えば Datatype モジュール) と依存しないモジュール (例えば Extended モジュール) を区別することができます。 このメソッドを使用して、インストールされている独自のモジュールを読み込むことも可能です。
3 番目のパラメータを省略した場合は、自動的に検出されます。 しかし、'safe_mode' が有効になっているホストでは、 この自動検出に失敗します。検出の際に fopen() を使用しているからです。それに応じたエラー処理を行う必要があります。
モジュールの読み込み
<?php
require_once 'MDB2.php';
$dsn = 'pgsql://someuser:apasswd@localhost/thedb';
$options = array(
'debug' => 2,
'result_buffering' => false,
);
$mdb2 =& MDB2::connect($dsn, $options);
if (PEAR::isError($mdb2)) {
die($mdb2->getMessage());
}
// ...
$mdb2->loadModule('Manager');
// これから読み込むモジュールが RDBMS に依存しないことを宣言します。
// これにより、不要な内部関数のコールを回避します。
$mdb2->loadModule('Extended', null, false);
?>
RDBMS に依存しない独自モジュールの読み込み
<?php
// ...
// ファイルが [peardir]/MDB2/MyModule.php に存在する必要があります
class MDB2_MyModule extends MDB2_Module_Common
{
function myMethod()
{
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
...
}
}
?>
<?php
// ...
// ファイルが [peardir]/MDB2/MyModule.php に存在する必要があります
$mdb2->loadModule('MyModule');
?>
RDBMS に依存する独自モジュールの読み込み
<?php
// ...
// ファイルが [peardir]/MDB2/Driver/MyRDBMSModule/pgsql.php に存在する必要があります。
// これは、MDB2 PostgreSQL インスタンスが読み込むためのクラスです。
// 他のバックエンド用の同等のクラスも実装する必要があります。
// 一般的には共通の基底クラスを用意することになるでしょう。
class MDB2_Driver_MyRDBMSModule_pgsql extends MDB2_Module_Common
{
function myRDBMSMethod()
{
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
...
}
}
?>
<?php
// ...
// ファイルが [peardir]/MDB2/Driver/MyRDBMSModule/[phptype].php
// に存在する必要があります。
$mdb2->loadModule('MyRDBMSModule');
?>
読み込んだモジュールの使用
<?php
// ...
// デフォルトの名前での読み込み
$mdb2->loadModule('Manager');
$tables = $mdb2->manager->listTables();
// 標準とは異なる名前の $foo というプロパティとしての読み込み
$mdb2->loadModule('Function', 'foo');
$tables = $mdb2->foo->concat($str1, $str2);
?>
PHP5 では、オーバーロードを使用してモジュールの読み込みとコールを行うことができます。
'modules' オプションで PHP5 のオーバーロードを利用する
<?php
require_once 'MDB2.php';
$dsn = 'pgsql://someuser:apasswd@localhost/thedb';
$options = array(
'debug' => 2,
'result_buffering' => false,
);
$mdb2 =& MDB2::connect($dsn, $options);
if (PEAR::isError($mdb2)) {
die($mdb2->getMessage());
}
// ...
$module_shorthands = $mdb2->getOptions('modules');
// モジュール名の短縮形を、メソッド名の先頭に付加します。
// そして元のメソッド名の最初の文字を大文字にします。
$tables = $mdb2->mgListTables();
?>
PHP5 のオーバーロードを使用して、読み込んだモジュールのメソッドをコールする
<?php
require_once 'MDB2.php';
$dsn = 'pgsql://someuser:apasswd@localhost/thedb';
$options = array(
'debug' => 2,
'result_buffering' => false,
);
$mdb2 =& MDB2::connect($dsn, $options);
if (PEAR::isError($mdb2)) {
die($mdb2->getMessage());
}
// ...
$mdb2->loadModule('Manager');
// manager モジュールが読み込まれているので、
// listTable() メソッドをコールすることができます。
$tables = $mdb2->manager->listTables();
// 注意: PHP5 では __autoload() が使用できるので、
// 上の行は次のように書くこともできます。
$tables = $mdb2->listTables();
?>