典型的な PDO ドライバのソースディレクトリは以下のようになっています。 ここで、SKEL はドライバが接続しようとしている データベース名の短縮形式を表します。ここでは SKEL が大文字で 表記されていますが(存在をはっきりさせるためです)、実際は 小文字を使用するのが慣例です。
pdo_SKEL/ config.m4 # unix build script config.w32 # win32 build script CREDITS package.xml # meta information about the package pdo_SKEL.c # standard PHP extension glue php_pdo_SKEL.h php_pdo_SKEL_int.h # driver private header SKEL_dbh.c # contains the implementation of the PDO driver interface SKEL_stmt.c # contains the implementation of the PDO statement interface tests/
これらのファイルの内容については、この文書の後半で説明します。
開発を始めるにあたっての最もお手軽な方法は、PHP ビルドツリーの ext ディレクトリにあるシェルスクリプト ext_skel を使用することです。 このスクリプトは、上で挙げた多くのファイルを含む雛形ディレクトリを 作成します。スクリプトは、ext ディレクトリの 中で以下のように実行します。
./ext_skel --extname=pdo_SKEL
これにより pdo_SKEL というディレクトリが作成され、その中に これから書き換えていく元となるファイルが作成されます 次に、このディレクトリを PHP のエクステンションディレクトリに 移動します。PDO は PECL 拡張モジュールなので、標準的な エクステンションディレクトリには含まれません。 PHP および PDO がインストールされていれば、どのディレクトリからでも ビルドすることが可能です。
configure の際に、ドライバのビルドに使用するプラットフォーム固有の ヘッダファイル config.h が作成されます。このヘッダが存在する場合、 コンパイラ変数 HAVE_CONFIG_H が設定されます。コンパイル時には この変数が存在するかどうかが調べられ、もし設定されていれば config.h が include されます。
各ソースモジュールには、以下の標準 PHP ヘッダが include されます。
php.h
php_ini.h
ext/standard/info.h
各ソースモジュールには、以下の標準 PDO ヘッダファイルも include されます。
このヘッダファイルには、ドライバの初期化やシャットダウンのための 関数の定義やグローバル PDO 変数の定義が含まれます。
このヘッダには、PDO ドライバを書く際に使用する型や API の規約が 含まれます。PDO レイヤへのコールバックの定義、PDO にドライバを 登録したり登録を解除したりする関数の定義も含まれます。 最も重要なものとして、このヘッダファイルには PDO データベース ハンドルやステートメントの型定義が含まれています。 ドライバが主に使用する 2 つの構造体 pdo_dbh_t および pdo_stmt_t については、それぞれ 付録 A および B で詳細に説明します。
典型的な PDO ドライバは 2 つのヘッダファイルを保持しており、ここに データベースの実装に依存する内容が記述されます。実装内容によって これが変わることがあってもかまいませんが、規約では以下の 2 つの ヘッダが標準となっています。
このヘッダファイルは、先ほど挙げた pdo/php_pdo.h の機能と内容を 完全に複製したもので、データベースに応じて変更していきます。 ドライバがグローバル変数を使用する場合、マクロ ZEND_BEGIN_MODULE_GLOBALS および ZEND_END_MODULE_GLOBALS を 使用してそれを定義しておく必要があります。これらの変数に アクセスする際に、マクロが使用されます。このマクロは 通常は PDO_SKEL_G(v) という名前で、v がアクセスされる グローバル変数となります。 詳細な情報は、Zend のプログラマ向けドキュメントを参照ください。
このヘッダファイルには、ドライバの実装固有の型定義や関数宣言が 含まれます。また、データベース固有の構造体 pdo_SKEL_handle および pdo_SKEL_stmt の定義も含みます。これらは private 構造体で、ハンドル構造体やステートメント構造体のメンバ driver_data として参照されます。
ドライバの実装方法によっては、以下のヘッダを include する 必要があるかもしれません。
#include <zend_exceptions.h>