準備

ソースディレクトリの構造

典型的な 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 がインストールされていれば、どのディレクトリからでも ビルドすることが可能です。

標準的な include ファイル

ビルド固有のヘッダ

configure の際に、ドライバのビルドに使用するプラットフォーム固有の ヘッダファイル config.h が作成されます。このヘッダが存在する場合、 コンパイラ変数 HAVE_CONFIG_H が設定されます。コンパイル時には この変数が存在するかどうかが調べられ、もし設定されていれば config.h が include されます。

PHP のヘッダ

各ソースモジュールには、以下の標準 PHP ヘッダが include されます。

  1. php.h

  2. php_ini.h

  3. ext/standard/info.h

PDO インターフェイスのヘッダ

各ソースモジュールには、以下の標準 PDO ヘッダファイルも include されます。

pdo/php_pdo.h

このヘッダファイルには、ドライバの初期化やシャットダウンのための 関数の定義やグローバル PDO 変数の定義が含まれます。

pdo/php_pdo_driver.h

このヘッダには、PDO ドライバを書く際に使用する型や API の規約が 含まれます。PDO レイヤへのコールバックの定義、PDO にドライバを 登録したり登録を解除したりする関数の定義も含まれます。 最も重要なものとして、このヘッダファイルには PDO データベース ハンドルやステートメントの型定義が含まれています。 ドライバが主に使用する 2 つの構造体 pdo_dbh_t および pdo_stmt_t については、それぞれ 付録 A および B で詳細に説明します。

ドライバ固有のヘッダ

典型的な PDO ドライバは 2 つのヘッダファイルを保持しており、ここに データベースの実装に依存する内容が記述されます。実装内容によって これが変わることがあってもかまいませんが、規約では以下の 2 つの ヘッダが標準となっています。

php_pdo_SKEL.h

このヘッダファイルは、先ほど挙げた pdo/php_pdo.h の機能と内容を 完全に複製したもので、データベースに応じて変更していきます。 ドライバがグローバル変数を使用する場合、マクロ ZEND_BEGIN_MODULE_GLOBALS および ZEND_END_MODULE_GLOBALS を 使用してそれを定義しておく必要があります。これらの変数に アクセスする際に、マクロが使用されます。このマクロは 通常は PDO_SKEL_G(v) という名前で、v がアクセスされる グローバル変数となります。 詳細な情報は、Zend のプログラマ向けドキュメントを参照ください。

php_pdo_SKEL_int.h

このヘッダファイルには、ドライバの実装固有の型定義や関数宣言が 含まれます。また、データベース固有の構造体 pdo_SKEL_handle および pdo_SKEL_stmt の定義も含みます。これらは private 構造体で、ハンドル構造体やステートメント構造体のメンバ driver_data として参照されます。

オプションのヘッダ

ドライバの実装方法によっては、以下のヘッダを include する 必要があるかもしれません。

#include <zend_exceptions.h>