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

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

作成日: 更新日:

基本的な使い方

『code』プロパティは、例外に関する整数値を保持するプロパティです。このプロパティは、DivisionByZeroErrorクラスが継承しているThrowableインターフェースで定義されており、エラーの種類をプログラム的に識別するために使用されます。DivisionByZeroErrorは、ゼロによる除算が行われた際にスローされるエラーで、例えば数値に対して除算演算子(/)や剰余演算子(%)を用いて0で割ろうとした場合に発生します。PHPの実行エンジンがこのエラーを自動的にスローする際、codeプロパティには通常、デフォルト値として0が設定されます。try-catchブロックでDivisionByZeroErrorを捕捉した際に、このcodeプロパティの値を取得することで、エラーの具体的な原因を特定し、その値に応じた条件分岐などの詳細なエラーハンドリングを実装できます。このように、codeプロパティは、例外処理のロジックをより細かく制御するための重要な役割を担っています。

構文(syntax)

1<?php
2
3try {
4    $result = 1 / 0;
5} catch (DivisionByZeroError $e) {
6    // DivisionByZeroError オブジェクトの code プロパティの値を取得します。
7    $exceptionCode = $e->getCode();
8    echo $exceptionCode;
9}
10
11?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

DivisionByZeroError クラスの code プロパティは、ゼロ除算エラーが発生した際の内部的なエラーコードを整数型で返します。

サンプルコード

PHP8 DivisionByZeroErrorコード取得処理

1<?php
2
3/**
4 * CodeIgniterアプリケーションを模倣したコントローラークラスの例です。
5 * 通常のCodeIgniterアプリケーションでは、このクラスはCodeIgniter\Controllerを継承し、
6 * 名前空間の下に配置されますが、ここでは単体で動作可能なようにシンプルなPHPクラスとして記述します。
7 */
8class CalculatorController
9{
10    /**
11     * 除算を実行し、0除算エラー (DivisionByZeroError) をハンドリングします。
12     * このメソッドは、PHP 8で導入された DivisionByZeroError 例外を捕捉し、
13     * そのエラーコード (code プロパティ) を取得する方法をシステムエンジニアを目指す初心者に示します。
14     *
15     * @param int $numerator   分子
16     * @param int $denominator 分母
17     * @return string 計算結果、またはエラーメッセージとエラーコード
18     */
19    public function divide(int $numerator, int $denominator): string
20    {
21        try {
22            // PHP 8では、0で除算を試みると DivisionByZeroError が自動的にスローされます。
23            // これにより、従来の「Warning: Division by zero」ではなく、捕捉可能な例外となります。
24            $result = $numerator / $denominator;
25            return "計算結果: " . $result . "\n";
26
27        } catch (DivisionByZeroError $e) {
28            // DivisionByZeroError を捕捉します。
29            // $e->code プロパティは、このエラーの特定の数値コードを提供します。
30            // DivisionByZeroError のデフォルトのエラーコードは通常 0 です。
31            $errorCode = $e->code;
32
33            // 初心者向けに、エラーメッセージとエラーコードを明確に示します。
34            // CodeIgniterアプリケーションでは、このようなエラーは通常、
35            // ログに記録されたり、開発者には詳細な情報が、ユーザーには
36            // よりユーザーフレンドリーなエラーページが表示されるよう処理されます。
37            $errorMessage = "エラーが発生しました。\n" .
38                            "メッセージ: " . $e->getMessage() . "\n" .
39                            "エラーコード: " . $errorCode . "\n";
40            return $errorMessage;
41
42        } catch (Throwable $e) {
43            // その他の予期せぬエラー (例: TypeErrorなど) も捕捉するための汎用的なcatchブロックです。
44            return "予期せぬシステムエラーが発生しました: " . $e->getMessage() . "\n";
45        }
46    }
47}
48
49// このコードを単体で実行するための例です。
50// CodeIgniterフレームワーク下では、通常ルーティング設定により
51// このコントローラーのメソッドがURL経由で呼び出されます。
52
53// CalculatorController のインスタンスを作成
54$controller = new CalculatorController();
55
56// --- 正常な除算の実行例 ---
57echo "--- 正常な除算の実行例 ---\n";
58echo $controller->divide(10, 2);
59echo "\n";
60
61// --- 0除算の実行例(DivisionByZeroError が発生し、捕捉されます) ---
62echo "--- 0除算の実行例(DivisionByZeroErrorを捕捉) ---\n";
63echo $controller->divide(10, 0);
64echo "\n";

このPHPサンプルコードは、PHP 8で導入された0除算エラーの処理方法を、CodeIgniterアプリケーションのコントローラーを模倣した形式で示しています。CalculatorControllerクラスのdivideメソッドでは、try-catchブロックを使って除算を実行しています。

PHP 8では、分母に0を指定して除算を試みると、自動的にDivisionByZeroErrorという例外がスローされるようになりました。これにより、従来の警告メッセージではなく、プログラムで捕捉して処理できるエラーとなりました。

catch (DivisionByZeroError $e)ブロックでは、このDivisionByZeroErrorを捕捉し、エラーの詳細情報を取得しています。ここで利用している$e->codeプロパティは、発生したDivisionByZeroErrorに割り当てられた数値コード(int型)を提供します。このcodeプロパティは引数を持ちませんが、エラーの種類を識別するための内部的な整数値を返します。DivisionByZeroErrorの場合、通常このコードは0です。

このエラーコードを取得することで、システムはエラーの種類に基づいて適切な対応を取ることができます。例えば、実際のCodeIgniterアプリケーションでは、このエラーコードをログに記録したり、ユーザーに分かりやすいエラーメッセージを表示したりする際に活用されます。サンプルコードの実行部分では、正常な除算と、DivisionByZeroErrorが捕捉される0除算の両方の結果を確認できます。

このサンプルコードは、PHP 8以降で0除算を試みた際に発生するDivisionByZeroError例外の基本的な処理方法を示しています。PHP 8より前では警告でしたが、現在はtry-catchブロックで捕捉可能な例外となりました。$e->codeプロパティは、このエラーに関する数値コードを提供しますが、DivisionByZeroErrorの場合、デフォルトでは通常0を返します。システム開発において、このような例外を適切に捕捉し、ユーザーに分かりやすいエラーメッセージを提示しつつ、開発者には詳細なエラーコードやスタックトレースをログに記録する堅牢なエラーハンドリングが重要です。CodeIgniterなどのフレームワーク環境では、エラーハンドリングはフレームワークの仕組みと連携して行われることが多いことを理解しておきましょう。

PHP 8 DivisionByZeroErrorコード取得処理

1<?php
2
3/**
4 * Executes a division operation and handles potential DivisionByZeroError.
5 *
6 * This function demonstrates how to catch a DivisionByZeroError and retrieve its code property.
7 * It adheres to recommended PHP coding standards (e.g., PSR-12),
8 * which tools like PHP_CodeSniffer help developers enforce for consistent code style.
9 *
10 * @param int $numerator The number to be divided.
11 * @param int $denominator The number by which to divide.
12 * @return void
13 */
14function safeDivide(int $numerator, int $denominator): void
15{
16    try {
17        // Attempt the division operation.
18        // In PHP 8, dividing an integer or float by zero directly throws a DivisionByZeroError.
19        $result = $numerator / $denominator;
20        echo "Result of {$numerator} / {$denominator}: {$result}" . PHP_EOL;
21    } catch (DivisionByZeroError $e) {
22        // Catch the specific error when division by zero occurs.
23        echo "Error: Division by zero attempted!" . PHP_EOL;
24
25        // The 'code' property provides an integer error code for the caught exception.
26        // For built-in errors like DivisionByZeroError, this code is often 0 by default
27        // unless explicitly set in a custom implementation or specific scenario.
28        echo "Error Code: " . $e->getCode() . PHP_EOL;
29        echo "Error Message: " . $e->getMessage() . PHP_EOL;
30    }
31}
32
33// --- Sample Usage ---
34
35// Example 1: Successful division
36safeDivide(10, 2);
37
38echo PHP_EOL; // Adds a blank line for better readability between examples
39
40// Example 2: Division by zero, which will trigger DivisionByZeroError
41safeDivide(10, 0);
42
43echo PHP_EOL;
44
45// Example 3: Another successful division resulting in a float
46safeDivide(7, 3);

このPHPコードは、ゼロによる除算が発生した場合にスローされるDivisionByZeroErrorの処理方法と、そのエラーに関する情報を取得する方法を示しています。safeDivide関数は、2つの整数を受け取り、除算を実行します。PHP 8では、数値のゼロ除算はDivisionByZeroErrorを発生させるため、try-catch構文を使ってこのエラーを安全に捕捉しています。

tryブロック内で通常の除算を試み、もし除数がゼロであった場合にはDivisionByZeroErrorcatchブロックで捕捉されます。catchブロック内では、$e->getCode()メソッドを呼び出すことで、発生したエラーのコード番号を取得できます。このgetCode()メソッドは、DivisionByZeroErrorクラスのcodeプロパティにアクセスするもので、引数を取らず、エラーを識別するための整数値(int型)を戻り値として返します。DivisionByZeroErrorのようなPHP内部のエラーでは、通常、このコードは0を返します。エラーメッセージは$e->getMessage()で取得可能です。

このサンプルコードは、PHPの標準的なコーディング規約(PSR-12など)に沿って記述されています。このような規約は、PHP_CodeSnifferのようなツールが自動的にチェックすることで、コードの一貫性と品質を保つのに役立ちます。エラーを適切に処理し、その詳細を把握することは、堅牢でメンテナンスしやすいプログラムを開発する上で非常に重要です。

PHP 8では、数値のゼロ除算はDivisionByZeroErrorというエラーを発生させるため、以前のバージョンとは挙動が異なる点に注意が必要です。プログラムの予期せぬ停止を防ぐためには、このエラーをtry-catchブロックで適切に捕捉することが重要です。DivisionByZeroErrorcodeプロパティは、組み込みエラーの場合、多くはデフォルト値の0を返しますが、カスタム例外では任意のエラーコードを設定できます。また、コードの品質や一貫性を保つためには、PHP_CodeSnifferのようなツールを活用し、PSR-12のような標準的なコーディング規約に沿った記述を心がけることが、後のメンテナンス性向上につながります。

関連コンテンツ

【PHP8.x】codeプロパティの使い方 | いっしー@Webエンジニア