【PHP8.x】UnderflowException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
codeプロパティは、スローされた例外に関連付けられた整数コードを保持するプロパティです。このプロパティは、UnderflowExceptionクラスが基底クラスであるExceptionクラスから継承したものであり、すべての組み込み例外クラスで利用可能です。開発者は、UnderflowExceptionのインスタンスを生成してスローする際に、コンストラクタの第二引数に任意の整数値を指定することで、例外に独自のコードを付与できます。このコードは、エラーの種類や発生状況をプログラム的に識別するために使用されます。例えば、同じUnderflowExceptionであっても、原因に応じて異なるコードを設定しておくことで、catchブロック内でその値を取得し、コードに基づいた条件分岐処理を実装できます。これにより、エラーメッセージの文字列内容に依存することなく、より安定的で精密なエラーハンドリングが可能となります。値が明示的に指定されなかった場合のデフォルト値は0です。プロパティの値を取得するには、getCode()メソッドを使用します。
構文(syntax)
1<?php 2 3try { 4 // 第2引数で例外コードを設定して UnderflowException をスローします 5 throw new UnderflowException("コンテナが空です。", 5001); 6} catch (UnderflowException $e) { 7 // getCode() メソッドで設定した例外コードを取得します 8 $errorCode = $e->getCode(); 9 echo $errorCode; // 5001 10}
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
code プロパティは、例外が発生した理由を示す整数コードを返します。
サンプルコード
CodeIgniterでUnderflowExceptionを処理する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * CodeIgniterのモデルクラスを模倣 7 * ニュース記事のデータ操作を担当する 8 */ 9class NewsModel 10{ 11 // 本来はデータベースから取得するが、サンプルでは空の配列とする 12 private array $articles = []; 13 14 /** 15 * スタックの最後から記事を取得します。 16 * 17 * @return array 最後にプッシュされた記事 18 * @throws UnderflowException 記事が1つも存在しない場合 19 */ 20 public function popArticle(): array 21 { 22 if (empty($this->articles)) { 23 // 空の配列から要素を取り出そうとした際にUnderflowExceptionをスローする。 24 // 第2引数で、例外に整数コードを設定できる。 25 // ここでは、リソースが見つからないことを示すカスタムコード 1001 を設定。 26 throw new UnderflowException('表示できる記事がありません。', 1001); 27 } 28 return array_pop($this->articles); 29 } 30} 31 32/** 33 * CodeIgniterのコントローラークラスを模倣 34 * ユーザーからのリクエストに応じてモデルを呼び出し、結果を出力する 35 */ 36class NewsController 37{ 38 private NewsModel $newsModel; 39 40 public function __construct() 41 { 42 $this->newsModel = new NewsModel(); 43 } 44 45 /** 46 * 最新の記事を表示するアクション 47 */ 48 public function showLatest(): void 49 { 50 header('Content-Type: text/plain; charset=utf-8'); 51 52 try { 53 // モデルから記事を取得しようと試みる 54 $article = $this->newsModel->popArticle(); 55 echo '最新記事: ' . $article['title']; 56 } catch (UnderflowException $e) { 57 // UnderflowExceptionを捕捉する 58 echo "エラー: " . $e->getMessage() . PHP_EOL; 59 60 // 捕捉した例外オブジェクトから、設定されたコードを取得する。 61 // UnderflowExceptionはExceptionクラスを継承しており、 62 // codeプロパティ (getCode()メソッド経由でアクセス) を持つ。 63 $exceptionCode = $e->getCode(); 64 echo "例外コード: " . $exceptionCode . PHP_EOL; 65 66 // 取得したコードに基づいて処理を分岐させる 67 if ($exceptionCode === 1001) { 68 // 本来のCodeIgniterならログ記録やエラーページ表示を行う 69 echo "システム対応: 記事が存在しないため、デフォルトページへリダイレクトします。"; 70 } 71 } 72 } 73} 74 75// --- アプリケーションの実行 --- 76// CodeIgniterのルーティングがコントローラーのメソッドを呼び出すことを想定 77$controller = new NewsController(); 78$controller->showLatest();
このPHPサンプルコードは、WebフレームワークであるCodeIgniterの構造を模倣し、UnderflowExceptionが持つcodeプロパティの具体的な利用方法を示しています。
NewsModelクラスは、記事データを管理する役割を担います。popArticleメソッド内で、記事が1つも存在しない空の配列からデータを取り出そうとした際にUnderflowExceptionを意図的に発生させています。このとき、コンストラクタの第2引数に、エラーの種類を識別するためのカスタムコードとして整数の1001を設定しています。
NewsControllerクラスでは、try...catch構文でこの例外を捕捉します。catchブロック内で、例外オブジェクトのgetCode()メソッドを呼び出しています。このメソッドは引数を取らず、例外に設定された整数コードを戻り値として返します。このサンプルでは1001が返されます。
取得した例外コードを利用することで、エラーメッセージの文字列に頼ることなく、エラーの種類に応じた処理をif文などで正確に分岐させることが可能になります。このようにcodeプロパティは、プログラムがエラーの種類を機械的に判断し、より的確なエラーハンドリングを行うために役立ちます。
例外を発生させる際、throwの第2引数に整数で「例外コード」を設定できます。このコードは、同じ種類の例外でも発生原因を区別するための識別子として機能します。サンプルでは「記事がない」という状況に1001というコードを割り当てています。catchブロックでは、$e->getCode()メソッドでこのコードを取得し、その値に基づいて処理を分岐させることが可能です。getMessage()が人間に向けた説明文であるのに対し、getCode()はプログラムがエラーの種類を正確に判断し、ログ記録のレベル変更や特定のエラーページ表示といった具体的な処理を制御するために役立ちます。この仕組みはPHPの標準機能であり、CodeIgniterのようなフレームワークで堅牢なエラー処理を実装する際に重要です。
PHP CodeSniffer準拠: UnderflowExceptionのエラーコード取得
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたスタックから要素を1つ取り出します。 7 * 8 * この関数は、PHP CodeSniffer (PSR-12) の規約に準拠しています。 9 * 10 * @param array<mixed> &$stack スタックとして扱う配列(参照渡し) 11 * @return mixed 取り出した要素 12 * @throws UnderflowException スタックが空の場合にスローされます 13 */ 14function popFromStack(array &$stack): mixed 15{ 16 // スタックが空かどうかを判定します 17 if (empty($stack)) { 18 // スタックが空の場合、UnderflowExceptionをスローします。 19 // 第2引数に、この例外の 'code' プロパティに設定される整数値を指定します。 20 throw new UnderflowException('スタックが空のため、要素を取り出せません。', 1001); 21 } 22 23 // 配列の末尾の要素を取り出して返します 24 return array_pop($stack); 25} 26 27// 空のスタックを準備します 28$myStack = []; 29 30try { 31 // 空のスタックから要素を取り出そうと試みます 32 echo "スタックから要素を取り出します...\n"; 33 popFromStack($myStack); 34} catch (UnderflowException $e) { 35 // UnderflowExceptionがスローされた場合の処理です 36 echo "エラーを捕捉しました。\n"; 37 echo 'メッセージ: ' . $e->getMessage() . "\n"; 38 39 // Exceptionオブジェクトが持つ `code` プロパティの値を取得し、表示します。 40 // getCode() メソッドは、このプロパティの値を返します。 41 $errorCode = $e->getCode(); 42 echo 'エラーコード: ' . $errorCode . "\n"; 43}
このPHPサンプルコードは、例外処理における UnderflowException クラスの code プロパティの役割を解説しています。code プロパティは、発生した例外に固有の整数コードを格納するために使用され、エラーの種類を識別するのに役立ちます。
コード内の popFromStack 関数は、配列が空の場合に UnderflowException を発生させます。例外を生成する際、new UnderflowException() の第1引数にエラーメッセージ文字列を、第2引数にエラーコードとなる整数(この例では 1001)を指定します。この第2引数に渡された値が、例外オブジェクトの code プロパティに設定されます。
try...catch ブロックでこの例外を捕捉した後、例外オブジェクト(変数 $e)の getCode() メソッドを呼び出すことで、code プロパティに設定された値を取得できます。getCode() メソッドは引数を取らず、戻り値として整数型(int)のエラーコードを返します。
このように code プロパティを利用することで、エラーメッセージの文字列に依存せず、数値によってエラーを判別し、コードに応じた分岐処理などを実装することが可能になります。
例外の code プロパティは、プログラムがエラーの種類を機械的に識別するための整数値です。getMessage() が人間向けのメッセージであるのに対し、code はエラーコードとして機能します。サンプルコードでは throw する際に第2引数で 1001 を設定し、catch ブロック内で $e->getCode() メソッドを使ってこの値を取得しています。このエラーコードを利用することで、if 文などでコードの値に応じた処理の分岐を実装できます。エラーの種類ごとにユニークなコードを割り当てることで、より堅牢なエラーハンドリングが可能になります。UnderflowException は、スタックが空の場合など、特定の状況に適した例外クラスを選択する良い例です。