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

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

作成日: 更新日:

基本的な使い方

codeプロパティは、ValueErrorクラスが表現する値のエラーに関連するエラーコードを保持するプロパティです。PHP 8で導入されたValueErrorは、関数の引数が正しいデータ型であるにもかかわらず、その値が論理的に不正であるか、受け入れられない範囲にある場合にスローされる例外です。

このcodeプロパティは、発生したValueErrorに付随する特定の数値コードを格納します。これにより、プログラムはエラーの種類をより詳細に識別しやすくなります。例えば、ある関数が期待する引数の値が特定の条件を満たさない場合、その条件に応じたユニークなエラーコードをこのプロパティに設定することができます。

通常、カスタムのエラーコードが明示的に指定されない限り、このcodeプロパティの値は0となります。しかし、より複雑なアプリケーションやライブラリでは、エラーの種類や原因を細かく区別するために、0以外の特定の数値を設定し、エラーハンドリングの際にその値を利用することが推奨されます。

システムエンジニアがエラー処理を実装する際、try-catchブロックでValueErrorを捕捉し、このcodeプロパティの値を確認することで、エラーの種類に応じた適切なログ記録や、ユーザーへのフィードバック、あるいは回復処理を実行することが可能になります。これは、PHPの全ての例外やエラーの基底となるThrowableインターフェースに定義されているgetCode()メソッドが返す値と連携しており、一貫したエラーハンドリング戦略を構築する上で非常に重要な役割を果たします。

構文(syntax)

1<?php
2try {
3    throw new ValueError("An invalid value was provided.", 1001);
4} catch (ValueError $e) {
5    echo $e->code;
6}

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

ValueError クラスの code プロパティは、発生したエラーの種類を示す整数値を返します。

サンプルコード

PHP ValueErrorで入力値を検証する

1<?php
2
3/**
4 * ユーザーから受け取ったデータの処理を模倣し、
5 * 不適切な値が検出された場合にValueErrorをスローする関数。
6 *
7 * この関数は、CodeIgniterのようなWebフレームワークを用いたアプリケーションにおいて、
8 * ユーザー入力のバリデーション中に不適切な値(例: ページングのための負の項目数)が検出された
9 * シナリオを想定しています。
10 *
11 * @param string $inputName 入力フィールドの名前(例: 'items_per_page')
12 * @param mixed $inputValue 入力された値
13 * @throws ValueError 入力値が不適切である場合
14 * @return string 処理が成功した場合の、文字列に変換された入力値
15 */
16function processValidatedInput(string $inputName, mixed $inputValue): string
17{
18    // 'items_per_page'という入力が、1以上の整数であることを期待すると仮定します。
19    // それ以外の値は不適切としてValueErrorをスローします。
20    if ($inputName === 'items_per_page') {
21        if (!is_int($inputValue) || $inputValue < 1) {
22            // 不適切な値の場合、ValueErrorをスローし、カスタムのエラーコード (1001) を設定します。
23            // ValueErrorのコンストラクタは (メッセージ, コード, 前の例外) の順です。
24            throw new ValueError(
25                "入力 '{$inputName}' は1以上の整数である必要があります。現在の値: " . var_export($inputValue, true),
26                1001 // ここでエラーコードをint型で指定します。
27            );
28        }
29        return (string) $inputValue; // 処理が成功した場合
30    }
31
32    // その他の入力名の場合は、そのまま返す(この例示のため)
33    return (string) $inputValue;
34}
35
36// --- サンプルコードの実行 ---
37
38// 1. 正常なケース: 期待される適切な値を渡す
39echo "--- 正常なケース ---\n";
40try {
41    $processedValue = processValidatedInput('items_per_page', 10);
42    echo "入力 'items_per_page' の処理結果: " . $processedValue . "\n";
43} catch (ValueError $e) {
44    // 正常なケースなので、ここは実行されないはずです。
45    echo "エラーが発生しました (コード: " . $e->getCode() . "): " . $e->getMessage() . "\n";
46}
47
48// 2. 異常なケース: ValueErrorを発生させる値を渡す (0は不適切)
49echo "\n--- 異常なケース (不適切な値: 0) ---\n";
50try {
51    $processedValue = processValidatedInput('items_per_page', 0); // 1未満の値を渡す
52    echo "入力 'items_per_page' の処理結果: " . $processedValue . "\n";
53} catch (ValueError $e) {
54    // ValueErrorを捕捉し、そのメッセージとコードプロパティの値を表示します。
55    echo "エラーが発生しました: " . $e->getMessage() . "\n";
56    // $e->code は例外オブジェクトが持つプロパティで、エラーコード (int型) を返します。
57    echo "取得されたエラーコード: " . $e->getCode() . " (int型)\n"; 
58}
59
60// 3. 別の異常なケース: 不適切な型を渡す ('abc'は整数ではない)
61echo "\n--- 別の異常なケース (不適切な値: 'abc') ---\n";
62try {
63    $processedValue = processValidatedInput('items_per_page', 'abc'); // 整数ではない値を渡す
64    echo "入力 'items_per_page' の処理結果: " . $processedValue . "\n";
65} catch (ValueError $e) {
66    // ValueErrorを捕捉し、そのメッセージとコードプロパティの値を表示します。
67    echo "エラーが発生しました: " . $e->getMessage() . "\n";
68    echo "取得されたエラーコード: " . $e->getCode() . " (int型)\n";
69}

PHPのValueError::codeは、不適切な値が関数に渡された際に発生するValueError例外が持つプロパティです。このcodeプロパティは、発生したエラーの種類を識別するための整数値(int型)を保持します。開発者はValueErrorをスローする際に、このエラーコードを任意に指定でき、エラー発生時にそのコードを取得することで、プログラム的にエラーの種類を判別し、適切な処理を行うことが可能になります。

サンプルコードでは、ウェブアプリケーションにおけるユーザー入力の検証を想定したprocessValidatedInput関数が定義されています。この関数は、items_per_pageという入力が1以上の整数であるかをチェックし、不適切な値(0や文字列など)が検出された場合にValueErrorをスローします。このとき、throw new ValueError(...)の第2引数でカスタムエラーコード1001を設定しています。

try-catchブロックでValueErrorを捕捉すると、例外オブジェクト$eから$e->getCode()メソッド(または直接$e->codeプロパティ)を使って、スローされたエラーコード1001を取得できます。これにより、エラーメッセージとは別に、エラーの種類を数値で特定し、より柔軟なエラーハンドリングを実現できます。このcodeプロパティは引数を取らず、常にint型の数値を返します。

PHPのValueErrorは、関数に不適切な値が渡されたことを示す例外です。この例外をスローする際、コンストラクタの第二引数に任意の整数値でカスタムのエラーコードを設定できます。これにより、エラーの種類を具体的に識別できるようになります。try-catchブロックで例外を捕捉した後、getCode()メソッドを使用することで、設定したエラーコードを取得し、エラーハンドリングで活用できます。サンプルコードでは、CodeIgniterのようなフレームワークにおけるユーザー入力のバリデーション中に、不適切な値が検出された際にカスタムエラーコード1001を付与してValueErrorをスローし、そのコードを取得する例を示しています。エラーコードの利用は、問題の特定と適切な対応に役立ちます。

PHP ValueError::codeでエラーを処理する

1<?php
2
3/**
4 * 正の偶数を受け取り、そのまま返します。
5 * 入力値が正の偶数でない場合はValueErrorをスローします。
6 *
7 * この関数は、入力値の検証とそれに関連するエラーハンドリングの例を示し、
8 * ValueError::code プロパティの使用方法を実演します。
9 * PHPの推奨コーディングスタイルに従っています。
10 *
11 * @param int $number 検証する数値。
12 * @return int 入力された正の偶数。
13 * @throws ValueError 数値が条件を満たさない場合、適切なエラーコードを付けてスローします。
14 */
15function processPositiveEvenNumber(int $number): int
16{
17    if ($number <= 0) {
18        // エラーコード1001: 正の数ではない
19        throw new ValueError('入力値は正の数である必要があります。', 1001);
20    }
21
22    if ($number % 2 !== 0) {
23        // エラーコード1002: 偶数ではない
24        throw new ValueError('入力値は偶数である必要があります。', 1002);
25    }
26
27    return $number;
28}
29
30// === サンプルコード実行部分 ===
31
32// ケース1: 有効な入力
33echo "--- ケース1: 有効な入力 ---\n";
34try {
35    $result = processPositiveEvenNumber(10);
36    echo "入力 '10' は有効です。結果: " . $result . "\n\n";
37} catch (ValueError $e) {
38    // このケースではValueErrorは捕捉されません
39    echo "予期せぬValueErrorを捕捉しました:\n";
40    echo "コード: " . $e->code . ", メッセージ: " . $e->getMessage() . "\n\n";
41}
42
43// ケース2: 負の数(エラーコード 1001 を想定)
44echo "--- ケース2: 負の数 ---\n";
45try {
46    processPositiveEvenNumber(-4);
47    echo "この行は実行されません。\n\n"; // エラーでスキップされる
48} catch (ValueError $e) {
49    echo "ValueErrorを捕捉しました:\n";
50    echo "エラーコード: " . $e->code . "\n"; // ValueError::codeプロパティの使用例
51    echo "メッセージ: " . $e->getMessage() . "\n\n";
52}
53
54// ケース3: 奇数(エラーコード 1002 を想定)
55echo "--- ケース3: 奇数 ---\n";
56try {
57    processPositiveEvenNumber(7);
58    echo "この行は実行されません。\n\n"; // エラーでスキップされる
59} catch (ValueError $e) {
60    echo "ValueErrorを捕捉しました:\n";
61    echo "エラーコード: " . $e->code . "\n"; // ValueError::codeプロパティの使用例
62    echo "メッセージ: " . $e->getMessage() . "\n\n";
63}

PHPのValueError::codeプロパティは、プログラムの実行中に発生した値に関するエラー(ValueError)の種類を、数値(int型)で具体的に識別するために利用されます。このプロパティには引数はなく、エラーオブジェクトから直接アクセスすることで、あらかじめ設定されたエラーコードを取得できます。

サンプルコードでは、processPositiveEvenNumber関数が、渡された数値が「正の偶数」であるかを検証しています。もし条件を満たさない場合、ValueErrorをスロー(発生)させますが、このときエラーの種類に応じて1001や1002といった特定のエラーコードを付与しています。例えば、負の数であればコード1001、奇数であればコード1002といった具合です。

これらのエラーはtry-catchブロックで捕捉され、catchブロック内では捕捉したエラーオブジェクト$eから$e->codeとしてプロパティにアクセスすることで、そのエラーがどの条件によって発生したのかを示す数値を読み取ることができます。これにより、開発者はエラーメッセージだけでなく、数値コードによってもエラー原因を明確に判断し、より詳細で適切なエラー処理を行うことが可能になります。サンプルコードの実行部分では、有効な入力と、負の数や奇数といった無効な入力の両方を試し、無効な入力の際にValueError::codeプロパティがどのように利用され、特定のエラーコードが出力されるかを示しています。

ValueErrorは、関数の引数などが不正な場合に発生する標準の例外です。ValueError::codeプロパティは、エラーの種類を数値で明確に識別するために使われます。これにより、例外メッセージの内容に依存せず、プログラムでエラーコードを基に安定した分岐処理や国際化対応が可能になります。独自のエラーコードを使用する際は、プロジェクト全体で一貫した定義と管理を徹底することが重要です。例外がスローされた場合は、必ずtry-catchブロックで捕捉し、適切にエラーハンドリングを行うことで、プログラムの予期せぬ終了を防ぎ、安全性を確保してください。また、サンプルコードのようにDocBlockで@throwsを明記し、php codesnifferなどのツールでコーディングスタイルを遵守することは、コードの可読性と保守性の向上に繋がります。

関連コンテンツ

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