Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Pdo\Sqlite::FETCH_CLASS定数の使い方

FETCH_CLASS定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

FETCH_CLASS定数は、PHPのPDO拡張機能において、データベースから取得した結果セットの各行を、指定されたクラスのインスタンスとしてフェッチするモードを表す定数です。これは、PDOStatement::fetch()やPDOStatement::fetchAll()などのメソッドを使用する際に、結果セットの取得形式(フェッチモード)を指定するために用いられます。この定数を指定すると、PDOはデータベースの各行を、ユーザーが定義した特定のクラスの新しいオブジェクトとして作成し、そのオブジェクトのプロパティにデータベースのカラム値を自動的にマッピングします。例えば、データベースからユーザーテーブルのデータを取得する際に、あらかじめ定義しておいたUserクラスをこの定数と共に指定することで、取得した各行がUserクラスのインスタンスとして返されます。これにより、データベースのレコードを、単純な配列としてではなく、プロパティや関連するメソッドを持つ具体的なオブジェクトとして扱うことができるため、コードの可読性や保守性が向上し、よりオブジェクト指向的なアプローチでのデータ操作が可能になります。この定数を効果的に活用することで、データベースのデータとアプリケーション内のオブジェクトモデルとの連携をスムーズに行うことができ、特にORM(Object-Relational Mapping)のようなパターンを実装する際に非常に強力なツールとなります。使用する際には、クラス名と必要に応じてコンストラクタ引数を指定する必要がある点にご留意ください。

構文(syntax)

1<?php
2
3class User
4{
5    public int $id;
6    public string $name;
7}
8
9$pdo = new PDO('sqlite::memory:');
10$pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
11$pdo->exec("INSERT INTO users (name) VALUES ('Alice'), ('Bob')");
12
13$stmt = $pdo->prepare('SELECT id, name FROM users');
14$stmt->execute();
15
16$users = $stmt->fetchAll(PDO::FETCH_CLASS, User::class);

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

PDO::FETCH_CLASS は、PDOStatement::fetch() および PDOStatement::fetchAll() メソッドで、指定されたクラスのインスタンスとして結果セットの行をフェッチするための定数です。この定数は整数値として表現されます。

サンプルコード

PHP PDO::FETCH_CLASSでクラスにマッピングする

1<?php
2
3/**
4 * データベースから取得したユーザー情報を格納するためのクラス。
5 * PDO::FETCH_CLASS と組み合わせることで、クエリ結果をこのクラスのオブジェクトとしてマッピングできます。
6 */
7class User
8{
9    // データベースのカラム名と一致するプロパティを定義します。
10    // プロパティには型宣言(PHP 7.4以降)を追加し、コードの安全性を高めます。
11    public int $id;
12    public string $name;
13    public string $email;
14
15    /**
16     * ユーザー情報を整形して文字列として返します。
17     *
18     * @return string 整形されたユーザー情報
19     */
20    public function describe(): string
21    {
22        return "ID: {$this->id}, 名前: {$this->name}, メール: {$this->email}";
23    }
24}
25
26/**
27 * PDO::FETCH_CLASS 定数の使用方法を示すサンプルコードです。
28 * SQLite のインメモリデータベースを使用し、単体で動作可能です。
29 */
30function demonstratePdoFetchClass(): void
31{
32    // SQLite のインメモリデータベースを使用します。
33    // これにより、一時的なデータベースがメモリ上に作成され、スクリプト終了時に破棄されます。
34    $dbPath = 'sqlite::memory:';
35
36    try {
37        // PDO (PHP Data Objects) オブジェクトを作成し、データベースに接続します。
38        // PDO は、様々なデータベースに統一的なインターフェースでアクセスするためのPHPの拡張機能です。
39        $pdo = new PDO($dbPath);
40
41        // エラーモードを例外 (ERRMODE_EXCEPTION) に設定します。
42        // これにより、SQLエラーが発生した場合にPDOExceptionがスローされ、
43        // try-catchブロックで適切にエラーを処理できるようになります。
44        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
45
46        echo "データベースに接続しました。\n\n";
47
48        // users テーブルを作成するSQLを実行します。
49        // IF NOT EXISTS は、テーブルが既に存在する場合は作成しないことを意味します。
50        $pdo->exec("
51            CREATE TABLE IF NOT EXISTS users (
52                id INTEGER PRIMARY KEY AUTOINCREMENT,
53                name TEXT NOT NULL,
54                email TEXT NOT NULL UNIQUE
55            )
56        ");
57        echo "usersテーブルを作成しました。\n\n";
58
59        // サンプルデータを挿入します。
60        // PDOStatement::exec() は、結果セットを返さないSQL文(INSERT, UPDATE, DELETEなど)を実行する際に使われます。
61        $pdo->exec("INSERT INTO users (name, email) VALUES ('アリス', 'alice@example.com')");
62        $pdo->exec("INSERT INTO users (name, email) VALUES ('ボブ', 'bob@example.com')");
63        $pdo->exec("INSERT INTO users (name, email) VALUES ('チャーリー', 'charlie@example.com')");
64        echo "サンプルデータを挿入しました。\n\n";
65
66        // users テーブルから全てのデータを取得するSQLクエリを準備します。
67        $stmt = $pdo->query("SELECT id, name, email FROM users");
68
69        // PDO::FETCH_CLASS を使用して、クエリ結果を User クラスのオブジェクトの配列として取得します。
70        // fetchAll() の第一引数に PDO::FETCH_CLASS 定数を、第二引数にターゲットとなるクラス名 (User::class) を指定します。
71        // PDO::FETCH_CLASS は整数値を返す定数で、PDOStatement::fetchAll() や PDOStatement::fetch() の
72        // フェッチスタイルとして利用されます。
73        $users = $stmt->fetchAll(PDO::FETCH_CLASS, User::class);
74
75        echo "PDO::FETCH_CLASS を使用してユーザー情報を取得しました。\n";
76        echo "取得されたオブジェクト:\n";
77
78        // 取得したUserオブジェクトの配列をループし、各ユーザーの情報を表示します。
79        foreach ($users as $user) {
80            // $user は User クラスのインスタンスです。
81            // インスタンスメソッドやプロパティに直接アクセスできます。
82            echo "  - " . $user->describe() . "\n";
83        }
84        echo "\n";
85
86    } catch (PDOException $e) {
87        // PDO関連のエラーが発生した場合、そのメッセージを表示します。
88        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
89    } catch (Exception $e) {
90        // その他の予期せぬエラーが発生した場合、そのメッセージを表示します。
91        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
92    }
93}
94
95// サンプル関数を実行します。
96demonstratePdoFetchClass();

PHP 8で利用できるPDO::FETCH_CLASSは、データベースから取得したデータ行を、指定したクラスのオブジェクトとして直接マッピングするための定数です。この定数をPDOStatementfetch()fetchAll()メソッドの引数に指定することで、データベースのカラム名と一致するプロパティを持つクラスに、取得したデータを自動的に割り当てることができます。これにより、手動で配列からオブジェクトにデータを詰め替える手間を省き、コードの可読性やメンテナンス性を向上させることが可能です。

サンプルコードでは、Userクラスを定義し、idnameemailといったプロパティがデータベースのusersテーブルのカラムに対応するように設計されています。$stmt->fetchAll(PDO::FETCH_CLASS, User::class)のように記述すると、SELECT文で取得した各行がUserクラスの新しいインスタンスとなり、それぞれのプロパティにデータが格納された状態で配列として返されます。これにより、取得したデータは$user->id$user->nameのようにオブジェクトのプロパティとして直接アクセスでき、$user->describe()のようなクラスメソッドも利用可能になります。この定数自体は引数を取らず、内部的には整数値を返すもので、PDOのデータ取得スタイルを指定する際に利用されます。システムエンジニアを目指す初心者にとって、データベース操作をよりオブジェクト指向的に行い、安全で簡潔なコードを書く上で非常に役立つ機能です。

PDO::FETCH_CLASSを利用する際は、データベースのカラム名とオブジェクトに格納するクラスのプロパティ名を完全に一致させる必要があります。不一致の場合、そのプロパティにはデータがマッピングされません。クラスのプロパティは必ずpublicで宣言し、PHP 7.4以降の型宣言を使うことで、コードの安全性が向上します。データベースから取得した値は、宣言された型に自動変換されますが、変換できない場合はエラーになるため注意が必要です。もしクラスに引数を持つコンストラクタがある場合、fetchAllメソッドの第三引数にその引数を配列として渡す必要があります。また、サンプルコードは手軽に試せるインメモリデータベースですが、実際のアプリケーションでは永続的なデータベースを使用し、try-catchブロックでエラーを適切に処理する設計が重要です。

PHP PDO FETCH_CLASSでオブジェクトを取得する

1<?php
2
3/**
4 * データベースから取得したデータを格納するためのカスタムクラス。
5 * プロパティ名はデータベースのテーブルカラム名と一致させる必要があります。
6 */
7class UserData
8{
9    public int $id;
10    public string $name;
11    public string $email;
12
13    /**
14     * PDO::FETCH_CLASS は、引数なしでコンストラクタを呼び出した後、
15     * データベースのカラム名と一致するプロパティに値を直接設定します。
16     * そのため、ここでは特別な初期化は必須ではありません。
17     * (PHP 8ではプロパティに型指定を推奨します)
18     */
19    public function __construct()
20    {
21        // プロパティが直接設定されるため、通常は空で問題ありません。
22    }
23
24    /**
25     * ユーザー情報を整形して返します。
26     */
27    public function getFormattedInfo(): string
28    {
29        return "ID: {$this->id}, Name: {$this->name}, Email: {$this->email}";
30    }
31}
32
33/**
34 * PDO::FETCH_CLASS 定数を使用して、データベースからデータをカスタムオブジェクトとして
35 * フェッチする例を示します。
36 * システムエンジニアを目指す初心者向けに、SQLiteインメモリデータベースを使用し、
37 * 単体で動作するように構成されています。
38 */
39function demonstratePdoFetchClassUsage(): void
40{
41    $db = null; // PDOオブジェクトを初期化
42
43    try {
44        // 1. SQLiteインメモリデータベースに接続
45        // ':memory:' を使用すると、ディスクにファイルを作成せず、スクリプト実行中のみ有効なデータベースが作成されます。
46        echo "データベースに接続中...\n";
47        $db = new PDO('sqlite::memory:');
48        // PDOのエラーモードを例外(Exception)に設定し、エラー発生時にPDOExceptionがスローされるようにします。
49        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
50        echo "データベース接続成功。\n";
51
52        // 2. テーブルの作成
53        echo "テーブル 'users' を作成中...\n";
54        $db->exec("CREATE TABLE users (
55            id INTEGER PRIMARY KEY AUTOINCREMENT,
56            name TEXT NOT NULL,
57            email TEXT NOT NULL UNIQUE
58        )");
59        echo "テーブル 'users' 作成完了。\n";
60
61        // 3. サンプルデータの挿入
62        echo "サンプルデータを挿入中...\n";
63        $stmt = $db->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
64        $stmt->execute([':name' => 'Alice', ':email' => 'alice@example.com']);
65        $stmt->execute([':name' => 'Bob', ':email' => 'bob@example.com']);
66        $stmt->execute([':name' => 'Charlie', ':email' => 'charlie@example.com']);
67        echo "サンプルデータ挿入完了。\n";
68
69        // 4. PDO::FETCH_CLASS を使用してデータをフェッチ
70        // PDO::FETCH_CLASS は、PDOStatement::fetch() や fetchAll() メソッドの
71        // 第一引数に指定することで、結果セットの各行を特定のクラスのインスタンスとして取得する定数です。
72        // この定数は整数値であり、PHPのPDO拡張機能で定義されています。
73        echo "\n--- PDO::FETCH_CLASS を使用してデータを取得中 ---\n";
74        $stmt = $db->query("SELECT id, name, email FROM users");
75
76        // fetchAll() の第一引数に PDO::FETCH_CLASS、第二引数にカスタムクラス名 (::class) を指定します。
77        // これにより、取得される各行が UserData クラスのオブジェクトとしてマッピングされます。
78        $users = $stmt->fetchAll(PDO::FETCH_CLASS, UserData::class);
79
80        // 5. 取得したオブジェクトの表示
81        echo "取得されたユーザー情報:\n";
82        foreach ($users as $user) {
83            // $user は UserData クラスのインスタンスになります。
84            if ($user instanceof UserData) {
85                echo "- " . $user->getFormattedInfo() . "\n";
86            }
87        }
88        echo "--- データの取得と表示が完了しました ---\n";
89
90    } catch (PDOException $e) {
91        // データベース関連のエラーが発生した場合の処理
92        echo "\nデータベースエラーが発生しました: " . $e->getMessage() . "\n";
93        echo "エラーコード: " . $e->getCode() . "\n";
94    } finally {
95        // データベース接続を閉じる (スクリプト終了時に自動的に閉じられますが、明示的にnullにすることもできます)
96        $db = null;
97        echo "\nデータベース接続を閉じました。\n";
98    }
99}
100
101// 関数の実行
102demonstratePdoFetchClassUsage();

PDO::FETCH_CLASSは、PHPでデータベースを操作するPDO拡張機能で使用される定数です。この定数は、データベースから取得した各行のデータを、開発者が定義した特定のカスタムクラス(オブジェクト)のインスタンスとして受け取るために利用されます。

具体的には、PDOStatementオブジェクトのfetch()fetchAll()メソッドの第一引数にPDO::FETCH_CLASSを、第二引数に目的のクラス名(例: UserData::class)を指定します。すると、PDOは取得したデータベースのカラム名と一致するプロパティを持つオブジェクトを自動的に生成し、カラムの値をそのプロパティに直接設定します。この際、クラスのコンストラクタは引数なしで一度だけ呼び出されますが、プロパティへの値設定はその後に行われるため、通常、特別な初期化は不要です。

これにより、データベースの行データが、連想配列ではなく、メソッドを持つオブジェクトとして扱えるようになり、コードの可読性と保守性が高まります。PDO::FETCH_CLASSはそれ自体が整数値を持つ定数であり、引数を取ることはありません。この機能は、データをよりオブジェクト指向的に扱い、アプリケーションの構造を明確にする上で非常に有用です。

PDO::FETCH_CLASSを利用する場合、データを格納するカスタムクラスのプロパティ名は、データベースのテーブルカラム名と完全に一致させる必要があります。プロパティ名が異なると、該当するプロパティには値が設定されませんのでご注意ください。この定数を使うと、まず引数なしでクラスのコンストラクタが実行され、その後、データベースから取得した値が直接プロパティに代入されます。PHP 8以降では、クラスプロパティに適切な型指定を行うことで、コードの信頼性や可読性が向上するため推奨されます。本サンプルコードは学習用途ですが、実際のシステムを構築する際は、データベース接続情報の外部化や堅牢なエラー処理、そしてセキュリティ対策を適切に実装することが不可欠です。

関連コンテンツ