【PHP8.x】codeプロパティの使い方

codeプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

codeプロパティは、例外に関する整数コードを保持するプロパティです。このプロパティは、ClosedGeneratorExceptionクラスがPHPの基底クラスであるExceptionから継承したものです。そのため、PHPの他の多くの例外クラスと同様の役割を持ちます。主な目的は、発生した例外の原因をプログラムで識別・分類するための数値を提供することです。開発者は、try-catch構文で例外を捕捉した際に、例外メッセージの文字列で判断する代わりに、このcodeプロパティの数値によって処理を分岐させることができます。これにより、より効率的で信頼性の高いエラーハンドリングを実装することが可能になります。ClosedGeneratorExceptionは、すでに終了して閉じられたジェネレータに対して操作を行おうとした際にスローされますが、この例外がPHPの内部エンジンによって自動的にスローされた場合、codeプロパティの値は通常0に設定されます。このプロパティの値は、インスタンスのgetCode()メソッドを呼び出すことで取得できます。

構文(syntax)

1<?php
2
3$exception = new ClosedGeneratorException("Generator is closed.", 123);
4echo $exception->code;

引数(parameters)

戻り値(return)

int

このプロパティは、Generatorが閉じられた際に発生した例外のコード番号を整数値で返します。

サンプルコード

PHP: ClosedGeneratorException::code を取得する

1<?php
2
3/**
4 * ClosedGeneratorException::code のサンプル
5 *
6 * このコードは、PHPのジェネレータが既に閉じられた後に
7 * Generator::send() メソッドを呼び出そうとした際に発生する
8 * ClosedGeneratorException を捕獲し、その 'code' プロパティを表示する例です。
9 *
10 * 'code' プロパティは、例外の種類を特定するための数値コードを返します。
11 * ClosedGeneratorException の場合、通常、デフォルト値である 0 が返されます。
12 *
13 * この例は、CodeIgniterのようなフレームワークを使用するアプリケーション内で、
14 * 大量のデータ処理やストリーム処理にジェネレータが利用される場合の
15 * 例外処理の基本的な理解を助けることを目的としています。
16 */
17class GeneratorService
18{
19    /**
20     * 指定された範囲の数字を生成するジェネレータ関数。
21     * 仮想的に、データベースから大量のレコードをチャンクで取得する
22     * シナリオなどを想定できます。
23     *
24     * @param int $start 開始値
25     * @param int $end 終了値
26     * @return Generator
27     */
28    public function generateSequence(int $start, int $end): Generator
29    {
30        for ($i = $start; $i <= $end; $i++) {
31            yield $i;
32        }
33    }
34
35    /**
36     * 閉じられたジェネレータに対する操作で発生する
37     * ClosedGeneratorException をデモンストレーションします。
38     *
39     * @return void
40     */
41    public function demonstrateClosedGeneratorException(): void
42    {
43        echo "--- ジェネレータの利用と閉じられた状態の確認 ---\n";
44
45        // ジェネレータインスタンスを作成
46        $numbersGenerator = $this->generateSequence(1, 2);
47        echo "ジェネレータを生成しました。\n";
48
49        // ジェネレータを完全にイテレートして閉じます
50        foreach ($numbersGenerator as $number) {
51            echo "生成された値: " . $number . "\n";
52        }
53        echo "ジェネレータは全ての値を生成し、閉じられました。\n";
54
55        echo "\n--- 閉じられたジェネレータへの操作と例外処理 ---\n";
56
57        try {
58            // 既に閉じられたジェネレータに対して send() を呼び出すと
59            // ClosedGeneratorException が発生します。
60            echo "閉じられたジェネレータに値を送ろうと試みます (send())...\n";
61            $numbersGenerator->send('試行データ'); // ClosedGeneratorException をトリガー
62            echo "これは表示されません。\n"; // 例外が発生するため
63        } catch (ClosedGeneratorException $e) {
64            echo "ClosedGeneratorException を捕獲しました!\n";
65            echo "例外メッセージ: " . $e->getMessage() . "\n";
66            echo "ClosedGeneratorException::code の値: " . $e->getCode() . "\n";
67            // ClosedGeneratorException の 'code' プロパティは常に 0 を返します。
68            // これは、この例外が特定のアプリケーション定義エラーコードを持たない、
69            // PHP内部の標準的な例外であることを示しています。
70        } catch (Throwable $e) {
71            // その他の予期せぬ例外を捕獲
72            echo "予期せぬ例外が発生しました: " . $e->getMessage() . "\n";
73            echo "例外コード: " . $e->getCode() . "\n";
74        }
75
76        echo "\n--- 処理完了 ---\n";
77    }
78}
79
80// この GeneratorService クラスは、CodeIgniterのようなアプリケーションの
81// ライブラリやヘルパーとして利用されることを想定できます。
82$service = new GeneratorService();
83$service->demonstrateClosedGeneratorException();
84

PHPのClosedGeneratorException::codeプロパティは、ジェネレータが既に閉じられた後、Generator::send()などの操作を行おうとした際に発生するClosedGeneratorExceptionが持つ、例外の数値コードを表すプロパティです。このプロパティは引数を取らず、常にint型の値を返します。発生した例外の種類をプログラム上で識別するために利用されます。

サンプルコードでは、まずジェネレータが全ての値を生成し終えて閉じられる過程が示されています。その後、閉じられたジェネレータに対してsend()メソッドを呼び出すことでClosedGeneratorExceptionを意図的に発生させています。捕獲された例外オブジェクトからgetCode()メソッドを通じてこのプロパティにアクセスすると、戻り値として0が表示されます。これはClosedGeneratorExceptionがPHP内部で定義された標準的な例外であり、通常、特定のアプリケーション固有のエラーコードを持たないことを示しています。

CodeIgniterのようなウェブフレームワークでは、データベースからの大量データ処理やファイルストリームの読み込みなどでジェネレータが利用されることがあります。このプロパティの理解は、ジェネレータ利用時の例外処理を適切に行う上で役立ちます。

ClosedGeneratorException::codeプロパティは、特定のアプリケーション定義コードではなく、PHP内部の標準例外を示す0を常に返します。ジェネレータは、全ての値を生成し終えるか途中で閉じられると再利用できません。一度閉じられたジェネレータに対して操作を行うとこの例外が発生するため、大量データ処理でジェネレータを利用する際は、try-catchブロックでClosedGeneratorExceptionを適切に捕獲し、安全に処理することが不可欠です。CodeIgniterのようなフレームワーク環境でも同様に、ジェネレータのライフサイクルと例外処理を考慮した実装を心がけてください。

ClosedGeneratorExceptionのコードを取得する

1<?php
2
3/**
4 * Demonstrates catching a ClosedGeneratorException and accessing its code property.
5 *
6 * This function creates a simple generator, exhausts it, and then attempts to
7 * resume it, which intentionally triggers a ClosedGeneratorException.
8 * The exception is caught, and its message and code property are displayed.
9 * The code adheres to common PHP coding standards, which would typically pass
10 * checks by tools like PHP_CodeSniffer.
11 *
12 * @return int The integer code of the caught ClosedGeneratorException, which is typically 0 for this internal exception.
13 */
14function demonstrateClosedGeneratorExceptionCode(): int
15{
16    /**
17     * A simple generator that yields a single value.
18     *
19     * @return Generator
20     */
21    $simpleGenerator = function (): Generator {
22        yield 'First and only value';
23    };
24
25    $generator = $simpleGenerator();
26
27    // Consume the only value from the generator.
28    // After this loop, the generator is exhausted and effectively closed.
29    foreach ($generator as $value) {
30        echo "Generator yielded: " . $value . "\n";
31    }
32
33    // Attempting to resume a closed generator will throw a ClosedGeneratorException.
34    try {
35        echo "Attempting to resume the closed generator...\n";
36        // This line will trigger the ClosedGeneratorException because the generator is exhausted.
37        $generator->next();
38    } catch (ClosedGeneratorException $exception) {
39        echo "Caught ClosedGeneratorException!\n";
40        echo "Exception message: " . $exception->getMessage() . "\n";
41        // Access the 'code' property of the exception using the standard getCode() method.
42        echo "Exception code: " . $exception->getCode() . "\n";
43        return $exception->getCode();
44    }
45
46    // This return statement should not be reached if the exception is thrown as expected.
47    // It acts as a fallback for unexpected scenarios.
48    return -1;
49}
50
51// Execute the demonstration function.
52demonstrateClosedGeneratorExceptionCode();

このサンプルコードは、PHPのジェネレーターが閉じられた(終了した)後に操作を試みた際に発生するClosedGeneratorExceptionと、そのcodeプロパティ(例外コード)の利用方法を示しています。

まず、一つの値だけを生成するシンプルなジェネレーターを作成し、foreachループを使ってその値を完全に消費します。これにより、ジェネレーターは閉じられた状態になります。次に、閉じられたジェネレーターに対してnext()メソッドを呼び出すことで、意図的にClosedGeneratorExceptionを発生させています。

この例外はtry-catchブロックで捕捉され、例外オブジェクトのgetMessage()メソッドでメッセージを、getCode()メソッドで例外コードを取得し、表示しています。codeプロパティは、例外の種類を数値で識別するために用いられる整数値(int型)であり、ClosedGeneratorExceptionのような内部的な例外の場合、通常は0が返されます。このdemonstrateClosedGeneratorExceptionCode関数は、捕捉した例外のコードを戻り値としてint型で返します。

コード全体は、PHPの一般的なコーディング規約に沿っており、PHP_CodeSnifferのようなツールでのチェックにも適合するよう設計されています。システムエンジニアを目指す方にとって、ジェネレーターのライフサイクルと例外処理を学ぶ上で参考になるでしょう。

ジェネレータが既に終了している状態で再度操作しようとするとClosedGeneratorExceptionが発生します。この例外のcodeプロパティは通常0を返しますが、これはPHP内部の例外であり、特定の意味を持つエラーコードではない場合が多いです。そのため、codeの値に基づいて詳細な例外処理を分岐させることは推奨されません。例外コードの取得は、プロパティへの直接アクセスではなくgetCode()メソッドを使うのが一般的で安全な方法です。本コードはPHP 8以降を想定しており、実開発ではPHP_CodeSnifferのようなツールでコーディング規約を守ることが求められます。