データベース関連の機能強化
最後に、データベースドライバに関する強化・変更点について紹介します。
PDOドライバのサブクラス化
PHP 8.4では、PDOドライバがデータベースごとにサブクラス化されるようになり、DB固有の機能を呼び出すことが可能になりました。ファクトリメソッドconnectにより、PDOドライバの共通機能を利用しつつ、データベース固有の機能を利用することが容易になります。以下のサブクラスが利用可能です。
- SQLite:PdoSqliteクラス
- MySQL:PdoMySqlクラス
- PostgreSQL:PdoPgsqlクラス
- Oracle:PdoOciクラス
- ODBC:PdoOdbcクラス
- その他:PdoDblibクラス、PdoFirebirdクラス
PHP 8.4.1の時点では、クラス独自にメソッドや定数が実装されているのは、冒頭の3つ(SQLite、MySQL、PostgreSQL)のみです。
// SQLiteでDB構築後に利用可能
$pdoSQLite = new PdoSqlite('sqlite:sqlite3.db');
$callback = …コールバック関数の定義…
// SQLite独自メソッド:COLLATE句に使う関数collに$callbackを設定する
$pdoSQLite->createCollation('coll', $callback);
// MySQLでDB構築後に利用可能
$pdoMySQL = new PdoMySql('mysql:host=localhost;dbname=mydb');
// MySQL独自メソッド:直近のCRUD操作の間に発生した警告の数を返す
$pdoMySQL->getWarningCount();
// PostgresでDB構築後に利用可能
$pdoPgsql = new PdoPgsql('pgsql:host=localhost;dbname=mydb');
// PostgreSQL独自メソッド:プロセスIDを取得する
$pdoPgsql->getPid();
PDOクラスで、コンストラクタ引数に与えるDSN(Data Source Name)によって、自動的に使用するサブクラスを決定することもできるのは従来どおりですが、新たにファクトリメソッドconnectを使うことができるようになりました。
$dsn = 'sqlite:sqlite3.db'; // SQLiteの場合 $pdo = new PDO($dsn); // PDOはこれまでと同じ $pdo = PDO::connect($dsn); // ファクトリメソッド
PDOクラスのコンストラクタではPDOクラスのインスタンスが返されますが、connectメソッドではサブクラスのインスタンスが返されます。前者ではDB固有の機能は使えませんが、後者では可能です。
SQLドライバごとのパーサ
PHP 8.4では、データベースドライバごとにSQLパーサが実装されました。デフォルトのパーサと各データベースドライバは、表に挙げる機能をサポートします。
| データベース | 機能 |
|---|---|
| デフォルトパーサ |
|
| PDO_MYSQL |
|
| PDO_PGSQL |
|
| PDO_SQLITE |
|
まとめ
今回は、PHP 8.4の新機能のうち、クラス定義や言語仕様、データベース関連の強化ポイントを紹介しました。次回は、DOMの処理を目的とした機能や、関数と処理系の強化・改良ポイントを紹介します。
