Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】OutOfRangeException::fileプロパティの使い方

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

作成日: 更新日:

基本的な使い方

fileプロパティは、例外が発生したソースファイルのフルパスを文字列として保持するプロパティです。このプロパティはOutOfRangeExceptionクラスに属しています。OutOfRangeExceptionは、例えば配列の範囲外のインデックスにアクセスしようとした場合など、値が有効な範囲を超えていることを示すためにスローされる例外です。プログラムの実行中にこの例外が発生し、try...catchブロックで捕捉された際、fileプロパティを参照することで、具体的にどのファイルで問題が起きたのかを正確に特定できます。これは、特に複雑なシステムでのデバッグ作業において非常に重要な情報となります。通常、このプロパティの値は、公開されているgetFile()メソッドを通じて取得します。取得したファイル名は、エラーログへの記録や、開発者向けのエラーメッセージ表示などに活用され、迅速な問題解決を支援します。なお、このプロパティはPHPの全ての例外の基底クラスであるExceptionクラスで定義されており、OutOfRangeExceptionはこれを継承しているため利用できます。

構文(syntax)

1<?php
2
3try {
4    throw new OutOfRangeException("指定されたインデックスは範囲外です。");
5} catch (OutOfRangeException $e) {
6    // 例外がスローされたファイル名を取得します。
7    $fileName = $e->getFile();
8    echo $fileName;
9}
10
11?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

OutOfRangeException クラスの file プロパティは、例外が発生したファイル名を文字列として返します。

サンプルコード

PHPでファイル存在チェックする

1<?php
2
3/**
4 * 指定されたファイルパスのファイルが存在するかどうかを確認し、結果を表示します。
5 *
6 * この関数は、PHPの組み込み関数 `file_exists()` を使用して、
7 * ファイルやディレクトリの存在をチェックする基本的な方法を示します。
8 *
9 * @param string $filePath 確認したいファイルのパス
10 * @return void
11 */
12function checkFileExists(string $filePath): void
13{
14    // file_exists() は、ファイルまたはディレクトリが存在する場合に true を返します。
15    if (file_exists($filePath)) {
16        echo "ファイル '{$filePath}' は存在します。" . PHP_EOL;
17    } else {
18        echo "ファイル '{$filePath}' は存在しません。" . PHP_EOL;
19    }
20}
21
22// --- これより下が実行部分です ---
23
24// 確認用のファイル名を変数に格納します。
25$existingFileName = 'sample_file.txt';
26$nonExistingFileName = 'not_found.txt';
27
28// 1. 存在しないファイルで関数を呼び出します。
29echo "--- 存在しないファイルのチェック ---" . PHP_EOL;
30checkFileExists($nonExistingFileName);
31echo PHP_EOL;
32
33// 2. 存在するファイルで関数を呼び出すために、一時的にファイルを作成します。
34// file_put_contents() は、ファイルにデータを書き込みます。ファイルが存在しない場合は新規作成します。
35file_put_contents($existingFileName, 'これはテスト用のファイルです。');
36
37echo "--- 存在するファイルのチェック ---" . PHP_EOL;
38checkFileExists($existingFileName);
39echo PHP_EOL;
40
41// 後片付けとして、作成した一時ファイルを削除します。
42// unlink() はファイルを削除する関数です。
43if (file_exists($existingFileName)) {
44    unlink($existingFileName);
45    echo "クリーンアップ: '{$existingFileName}' を削除しました。" . PHP_EOL;
46}

このPHPサンプルコードは、file_exists() 関数を使用して、指定したファイルやディレクトリが実際に存在するかどうかを確認する方法を示しています。

file_exists() は、引数としてファイルへのパスを文字列で受け取ります。そして、そのパスにファイルまたはディレクトリが存在する場合は true を、存在しない場合は false を返します。この戻り値は、if 文などの条件分岐で利用するのが一般的です。

コードでは、まず checkFileExists という関数を定義し、その中で file_exists() を呼び出して結果に応じたメッセージを表示しています。実行部分では、最初に存在しないファイル名を渡して「存在しません」という結果を確認します。次に、file_put_contents() 関数でテスト用のファイルを一時的に作成し、そのファイル名を渡すことで「存在します」という結果が表示されることを実演しています。最後に unlink() 関数で後片付けとして作成したファイルを削除しています。このように file_exists() は、ファイルの読み書きや削除といった操作を行う前に、対象が存在するかを安全に確認するために非常に役立ちます。

file_exists() 関数はファイルだけでなく、ディレクトリの存在確認にも使用できます。注意点として、PHPはファイルの状態に関する情報をキャッシュするため、短時間でファイルの作成や削除を行う処理では、clearstatcache() 関数でキャッシュをクリアしないと期待通りの結果にならない場合があります。また、ファイルが実際に存在していても、PHPの実行ユーザーにそのファイルや親ディレクトリへのアクセス権限がない場合は false が返されることがあります。予期せぬ挙動を避けるため、パスを指定する際は、スクリプトの実行場所によらず常に同じ場所を指し示すことができる絶対パス(例: __DIR__ . '/sample.txt')で指定することが推奨されます。

PHPでファイル行を読み込み、範囲外なら例外を投げる

1<?php
2
3/**
4 * 指定されたファイルの特定の行を取得します。
5 *
6 * ファイルの内容を file_get_contents() で読み込み、行に分割します。
7 * 指定された行番号が存在しない場合、OutOfRangeException をスローします。
8 *
9 * @param string $filePath ファイルへのパス
10 * @param int $lineNumber 取得したい行番号 (1から始まる)
11 * @return string 指定された行の文字列
12 * @throws OutOfRangeException 指定された行番号が範囲外の場合
13 * @throws Exception ファイルが読み込めない場合
14 */
15function getLineFromFile(string $filePath, int $lineNumber): string
16{
17    // file_get_contents() でファイルの内容を一度に読み込む
18    // @ をつけているのは、ファイルが存在しない場合にPHPの警告を出さず、戻り値 false で判定するため
19    $content = @file_get_contents($filePath);
20
21    if ($content === false) {
22        throw new Exception("ファイル '{$filePath}' の読み込みに失敗しました。");
23    }
24
25    // ファイルの内容を改行コードで分割し、配列にする
26    $lines = explode(PHP_EOL, $content);
27
28    // 行番号は1から始まるため、配列のインデックスに変換 (-1 する)
29    $index = $lineNumber - 1;
30
31    // 指定されたインデックスが存在するかチェック
32    if (!isset($lines[$index])) {
33        // 存在しない場合は OutOfRangeException をスローする
34        $totalLines = count($lines);
35        throw new OutOfRangeException("行番号 {$lineNumber} は範囲外です。総行数: {$totalLines}");
36    }
37
38    return $lines[$index];
39}
40
41// --- メイン処理 ---
42
43// サンプル用のファイル名と内容を定義
44$sampleFilename = 'sample_data.txt';
45$sampleContent = "1行目: PHP\n2行目: file_get_contents\n3行目: OutOfRangeException";
46
47// サンプルファイルを作成
48file_put_contents($sampleFilename, $sampleContent);
49
50echo "ファイル '{$sampleFilename}' を作成しました。\n\n";
51
52try {
53    // 存在する行を読み込んで表示 (成功する例)
54    $line = getLineFromFile($sampleFilename, 2);
55    echo "2行目の内容: " . $line . "\n\n";
56
57    // 存在しない行 (範囲外) を読み込もうとする (例外が発生する例)
58    echo "存在しない5行目を読み込もうとします...\n";
59    getLineFromFile($sampleFilename, 5);
60} catch (OutOfRangeException $e) {
61    // OutOfRangeException を捕捉
62    echo "エラー: OutOfRangeException が発生しました。\n";
63    echo "メッセージ: " . $e->getMessage() . "\n";
64    // 例外オブジェクトの getFile() メソッドで、例外が発生したファイル名を取得
65    echo "発生ファイル: " . $e->getFile() . "\n";
66    echo "発生行番号: " . $e->getLine() . "\n";
67} catch (Exception $e) {
68    // その他の例外を捕捉
69    echo "エラー: " . $e->getMessage() . "\n";
70} finally {
71    // 処理の最後にサンプルファイルを削除
72    if (file_exists($sampleFilename)) {
73        unlink($sampleFilename);
74        echo "\nサンプルファイル '{$sampleFilename}' を削除しました。\n";
75    }
76}

このPHPサンプルコードは、例外処理の一つである OutOfRangeExceptionfile プロパティの動作を解説するものです。コードの中心となる getLineFromFile 関数は、指定されたファイルの特定行を取得する処理を行います。その際、まず file_get_contents() 関数を使用してファイルの内容を一度にすべて文字列として読み込みます。

次に、読み込んだ文字列を改行コードで分割し、各行を要素とする配列を作成します。もし、この関数にファイルの総行数を超えるような存在しない行番号を指定すると、配列の範囲外にアクセスしようとすることになり、OutOfRangeException というエラーが意図的に発生させられます。

try-catch構文を用いることで、この発生したエラーをプログラムの実行を停止させることなく捕捉できます。捕捉した OutOfRangeException のオブジェクトはエラーに関する詳細情報を持っており、getFile() メソッドを呼び出すことで file プロパティの値を取得できます。このプロパティは引数を取らず、戻り値としてエラーが発生したPHPスクリプト自体のファイル名を文字列で返します。これにより、プログラムのどこで問題が起きたのかを正確に特定するのに役立ちます。

file_get_contents関数はファイル全体を一度にメモリへ読み込むため、巨大なファイルを扱うとメモリ不足になる可能性があります。サンプルコードの@記号はエラー制御演算子で、警告を抑制しますが、多用するとデバッグが難しくなるため注意が必要です。行番号は1から始まりますが、プログラムが扱う配列は0から始まるため、「行番号 - 1」でインデックスを変換する点は初心者が間違いやすいポイントです。指定した行が存在しない場合に発生するOutOfRangeExceptiontry-catch構文で捕捉することで、プログラムが意図せず停止するのを防ぎます。エラーの有無にかかわらず後片付け処理を確実に行うため、finallyブロックの活用も重要です。

関連コンテンツ

関連プログラミング言語