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

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

作成日: 更新日:

基本的な使い方

dom\domexceptionクラスのcodeプロパティは、DOM操作中に発生したエラーの種類を示す数値コードを保持するプロパティです。このプロパティは、DOMExceptionオブジェクトが生成された際に、具体的なエラーの種類を特定するために設定されます。codeプロパティの値は、DOMExceptionインターフェースで定義されている定数のいずれかになります。

DOMExceptionインターフェースには、以下の定数が定義されており、codeプロパティの値として使用されます。

  • INDEX_SIZE_ERR: インデックスが範囲外の場合
  • DOMSTRING_SIZE_ERR: 文字列が長すぎる場合
  • HIERARCHY_REQUEST_ERR: ノードの挿入位置が不適切な場合
  • WRONG_DOCUMENT_ERR: ノードが別のドキュメントに属している場合
  • INVALID_CHARACTER_ERR: 無効な文字が使用された場合
  • NO_DATA_ALLOWED_ERR: データが許可されていないノードに対してデータが設定されようとした場合
  • NO_MODIFICATION_ALLOWED_ERR: ノードが変更を許可していない場合
  • NOT_FOUND_ERR: ノードが見つからない場合
  • NOT_SUPPORTED_ERR: 操作がサポートされていない場合
  • INUSE_ATTRIBUTE_ERR: 属性がすでに使用されている場合
  • INVALID_STATE_ERR: オブジェクトが無効な状態の場合
  • SYNTAX_ERR: 無効な構文が使用された場合
  • INVALID_MODIFICATION_ERR: 無効な変更が試みられた場合
  • NAMESPACE_ERR: 名前空間に関するエラーが発生した場合
  • INVALID_ACCESS_ERR: オブジェクトが使用をサポートしていない場合
  • VALIDATION_ERR: 検証エラーが発生した場合
  • TYPE_MISMATCH_ERR: 型が一致しない場合
  • SECURITY_ERR: セキュリティ上のエラーが発生した場合
  • NETWORK_ERR: ネットワークエラーが発生した場合
  • ABORT_ERR: 操作が中止された場合
  • URL_MISMATCH_ERR: URLが一致しない場合
  • QUOTA_EXCEEDED_ERR: クォータを超過した場合
  • TIMEOUT_ERR: タイムアウトが発生した場合
  • NOT_ALLOWED_ERR: 許可されていない操作が試みられた場合

システムエンジニアは、このcodeプロパティの値を確認することで、DOM操作中に発生したエラーの原因を特定し、適切なエラーハンドリングを行うことができます。例えば、INDEX_SIZE_ERRが発生した場合、配列や文字列のインデックスが範囲外になっていないかを確認する必要があります。NOT_FOUND_ERRが発生した場合は、指定された要素が存在するかどうかを確認する必要があります。

構文(syntax)

1DOMException::$code

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

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

サンプルコード

PHP DOMExceptionのcodeを取得する

1<?php
2
3/**
4 * CodeIgniterのコントローラーを模した、XML処理クラスのサンプルです。
5 * 意図的にDOM操作エラーを発生させ、DOMExceptionのcodeプロパティを取得します。
6 */
7class XmlProcessorController
8{
9    /**
10     * 不正なXMLデータを処理し、DOMExceptionを捕捉します。
11     */
12    public function processXml(): void
13    {
14        try {
15            // DOMDocumentオブジェクトを作成
16            $dom = new \DOMDocument('1.0', 'UTF-8');
17            $dom->loadXML('<root><item>Hello</item></root>');
18
19            // テキストノードを取得
20            $itemNode = $dom->getElementsByTagName('item')->item(0);
21            if ($itemNode === null || $itemNode->firstChild === null) {
22                throw new \Exception('指定されたノードが見つかりません。');
23            }
24            $textNode = $itemNode->firstChild;
25
26            // DOMExceptionを意図的に発生させる
27            // テキストノード(葉)に子要素を追加しようとするとエラーが発生する
28            $newElement = $dom->createElement('child');
29            $textNode->appendChild($newElement);
30
31            echo "XMLの処理が正常に完了しました。\n";
32        } catch (\DOMException $e) {
33            // DOMExceptionを捕捉し、エラー情報を表示する
34            echo "DOM操作中にエラーが発生しました。\n";
35
36            // codeプロパティからエラーコード(int)を取得する
37            $errorCode = $e->getCode();
38            echo "エラーコード: " . $errorCode . "\n";
39            echo "エラーメッセージ: " . $e->getMessage() . "\n";
40
41            // エラーコードに応じて処理を分岐する
42            switch ($errorCode) {
43                case DOM_HIERARCHY_REQUEST_ERR: // コード 3
44                    echo "エラー詳細: ノードを階層的に不正な場所に追加しようとしました。\n";
45                    break;
46                case DOM_NOT_FOUND_ERR: // コード 8
47                    echo "エラー詳細: 存在しないノードを参照しようとしました。\n";
48                    break;
49                default:
50                    echo "エラー詳細: その他のDOMエラーです。\n";
51                    break;
52            }
53        } catch (\Exception $e) {
54            // その他の例外を捕捉
55            echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
56        }
57    }
58}
59
60// クラスのインスタンスを作成し、メソッドを実行
61$controller = new XmlProcessorController();
62$controller->processXml();
63

DOMExceptioncodeプロパティは、PHPでXMLやHTMLなどを操作(DOM操作)する際にエラーが発生したとき、そのエラーの種類を識別するための整数値(エラーコード)を取得するものです。このプロパティは引数なしでアクセスでき、戻り値としてエラーの種類に応じた整数(int)を返します。

サンプルコードは、CodeIgniterのコントローラーを模したクラスで、意図的にDOM操作のエラーを発生させています。tryブロック内で、テキストデータしか持てないテキストノードに、さらに子要素を追加しようとすることでDOMExceptionを発生させます。

処理がcatchブロックに移行すると、例外オブジェクト$egetCode()メソッド(内部的にはcodeプロパティにアクセス)を呼び出し、エラーコードを取得します。取得したコードをswitch文で評価し、DOM_HIERARCHY_REQUEST_ERR(コード値3)のようなPHPの定義済み定数と比較することで、エラーの原因を特定し、状況に応じた具体的なエラーメッセージの表示や代替処理を行うことができます。このようにcodeプロパティは、詳細なエラーハンドリングを実装する上で重要な役割を果たします。

DOM操作で発生するDOMExceptiongetCode()メソッドは、エラーの種類を識別するための整数(エラーコード)を返します。これは、getMessage()が返す人間向けのメッセージとは異なり、プログラムでエラー原因を特定し、処理を分岐させるために使用します。サンプルコードのようにswitch文でエラーコードを判定する際は、3のような数値を直接書くのではなく、DOM_HIERARCHY_REQUEST_ERRのようなPHPが定義済みの定数を使うと、コードの意味が分かりやすくなり、保守性が向上します。XMLなどの外部データを扱うDOM操作は意図しないエラーが発生しやすいため、try...catchブロックで例外を適切に捕捉し、エラーコードに応じた処理を実装することが、安全で堅牢なアプリケーション開発において非常に重要です。

DOMExceptionのcodeを取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * DOMExceptionのcodeプロパティの使用例を示すクラス
7 *
8 * このコードはPHP_CodeSnifferのPSR-12標準に準拠しています。
9 */
10class DomExceptionCodeExample
11{
12    /**
13     * DOM操作で意図的に例外を発生させ、エラーコードを捕捉して表示します。
14     *
15     * @return void
16     */
17    public function demonstrate(): void
18    {
19        try {
20            // DOMDocumentオブジェクトを作成
21            $dom = new \DOMDocument('1.0', 'UTF-8');
22
23            // 親要素と子要素を作成
24            $parentElement = $dom->createElement('parent');
25            $childElement = $dom->createElement('child');
26
27            // 存在しない参照ノードの前に要素を挿入しようとして、
28            // DOMException (NOT_FOUND_ERR) を意図的に発生させる
29            // 参照ノードが親要素に属していないため、例外がスローされます。
30            $parentElement->insertBefore($childElement, new \DOMText('参照ノード'));
31        } catch (\DOMException $e) {
32            // 捕捉したDOMExceptionからエラーコードとメッセージを取得して表示
33            echo 'DOM操作中にエラーが発生しました。' . PHP_EOL;
34            // $e->code は DOMException::NOT_FOUND_ERR (値は 8) を返します
35            echo 'エラーコード: ' . $e->getCode() . PHP_EOL;
36            echo 'メッセージ: ' . $e->getMessage() . PHP_EOL;
37        }
38    }
39}
40
41// クラスのインスタンスを作成し、メソッドを実行
42$example = new DomExceptionCodeExample();
43$example->demonstrate();

PHPのdom\domexceptionクラスのcodeプロパティは、DOM(Document Object Model)操作中に発生した例外の種類を示す整数値を取得するために使用されます。このプロパティは引数を取らず、エラーコードをint型で返します。

提供されたサンプルコードでは、DOMDocumentを使ってXMLのような構造を操作する際に、意図的にDOMExceptionを発生させています。具体的には、存在しない参照ノードの前に要素を挿入しようとすることで、「NOT_FOUND_ERR」(ノードが見つからないエラー)という種類の例外がスローされます。

try-catchブロックでこの\DOMExceptionを捕捉すると、捕捉した例外オブジェクト$e$e->getCode()(または$e->code)を通じて、エラーの種類を示す数値を取得できます。この例では、NOT_FOUND_ERRに対応する整数値「8」が出力されます。このように、codeプロパティを利用することで、発生したDOMエラーが具体的にどのような原因によるものかをプログラムで判断し、適切なエラー処理を行うことが可能になります。また、このコードはPHP_CodeSnifferのPSR-12標準に準拠しており、コードの品質と可読性を保つ一例ともなっています。

DOMExceptionはDOM操作のエラーを示す例外で、そのcodeプロパティ(またはgetCode()メソッド)からは、エラーの種類を表す整数値が取得できます。このエラーコードは、DOMException::NOT_FOUND_ERRのようなクラス定数と比較することで、具体的にどのような問題が発生したのかを判断し、その種類に応じた適切な処理を分岐させる際に活用できます。

DOM操作はファイルや外部データとの連携が絡むこともあり、予期せぬエラーが発生しやすい点に注意が必要です。そのため、サンプルコードのように常にtry-catch文を用いて例外を捕捉し、エラーコードやメッセージを確認して適切にエラーハンドリングを行うことが、堅牢なシステム構築には欠かせません。

サンプルコードは学習のために意図的にエラーを発生させていますが、実際の開発では、このような無効なDOM操作を避けるようにコードを設計することが大切です。また、コード中のコメントにあるPHP_CodeSnifferは、コードの品質やスタイルを統一し、可読性・保守性を高めるための重要なツールですので、積極的に利用を検討しましょう。

関連コンテンツ

関連プログラミング言語