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

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

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

作成日: 更新日:

基本的な使い方

『fileプロパティは、例外が発生したソースファイルのフルパスを文字列として保持するプロパティです。このプロパティはLengthExceptionクラスが、その親クラスであるExceptionクラスから継承したものです。そのため、LengthExceptionだけでなく、PHPにおけるほとんどの例外オブジェクトで共通して利用することができます。fileプロパティの値は、プログラム中でthrowキーワードを用いて例外がスローされた際に、PHPエンジンによって自動的に設定されます。これにより、どのファイルでエラーが生じたかを正確に知ることが可能になります。この情報は、主にデバッグの過程で非常に役立ちます。例えば、try-catchブロックで例外を捕捉した際に、エラーログに発生ファイル名を記録することで、問題の原因調査を効率的に進めることができます。なお、このプロパティはprotectedスコープで宣言されているため、オブジェクトの外部から直接アクセスすることはできません。値を取得したい場合は、公開されているgetFile()メソッドを呼び出す必要があります。

構文(syntax)

1<?php
2
3try {
4    // LengthExceptionを意図的にスローします。
5    throw new LengthException("長さに関するエラーが発生しました。");
6} catch (LengthException $e) {
7    // 例外オブジェクトのgetFile()メソッドを通じて、
8    // protectedな$fileプロパティの値(例外がスローされたファイル名)を取得します。
9    echo $e->getFile();
10}
11
12?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

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

サンプルコード

PHPのfile_existsでパスの存在を確認する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * file_exists() を使用して、指定されたファイルまたはディレクトリの存在を確認します。
7 *
8 * @param string $path 確認したいファイルまたはディレクトリへのパス
9 * @return void
10 */
11function checkPathExistence(string $path): void
12{
13    // file_exists() は、指定されたパスにファイルまたはディレクトリが存在するかどうかを調べます。
14    // 存在する場合は true を、存在しない場合は false を返します。
15    if (file_exists($path)) {
16        // is_file() はパスが通常のファイルであるかを確認します。
17        // is_dir() はパスがディレクトリであるかを確認します。
18        if (is_file($path)) {
19            echo "ファイル '{$path}' は存在します。" . PHP_EOL;
20        } elseif (is_dir($path)) {
21            echo "ディレクトリ '{$path}' は存在します。" . PHP_EOL;
22        }
23    } else {
24        echo "ファイルまたはディレクトリ '{$path}' は見つかりませんでした。" . PHP_EOL;
25    }
26}
27
28// --- 関数の実行例 ---
29
30// 例1: 存在するファイルを確認 (このPHPスクリプト自身)
31// __FILE__ は現在実行中のPHPファイルのフルパスを返すマジック定数です。
32$existingFile = __FILE__;
33checkPathExistence($existingFile);
34
35// 例2: 存在するディレクトリを確認 (このPHPスクリプトが存在するディレクトリ)
36// __DIR__ は現在実行中のPHPファイルが存在するディレクトリのパスを返すマジック定数です。
37$existingDir = __DIR__;
38checkPathExistence($existingDir);
39
40// 例3: 存在しないファイルを確認
41$nonExistingFile = 'path/to/non_existing_file.txt';
42checkPathExistence($nonExistingFile);

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

checkPathExistenceという関数は、引数としてファイルまたはディレクトリへのパスを示す文字列$pathを受け取ります。この関数の中核となるfile_exists()は、引数で渡されたパスにファイルやディレクトリが存在すればtrueを、存在しなければfalseを返す役割を持ちます。

コードはfile_exists()の戻り値に応じて処理を分岐させます。パスが存在する場合(trueの時)は、さらにis_file()関数でファイルかどうか、is_dir()関数でディレクトリかどうかを判別し、結果に応じたメッセージを表示します。パスが存在しない場合(falseの時)は、「見つかりませんでした」と表示されます。

実行例では、__FILE__(実行中のPHPファイル自身)や__DIR__(そのファイルが存在するディレクトリ)といったPHPの定数を用いて、確実に存在するパスを確認する様子を示しています。これにより、関数の具体的な動作を理解しやすくなっています。

file_exists()関数は、名前からファイルのみを対象と捉えがちですが、実際にはディレクトリの存在も確認します。ファイルかディレクトリかを明確に区別したい場合は、サンプルコードのようにis_file()is_dir()と組み合わせて使うことが重要です。また、PHPはパフォーマンス向上のためにファイルの状態に関する情報を一時的に保存(キャッシュ)します。そのため、ファイルの作成や削除を直後に行った際に、古い情報に基づいて判定されることがあります。この問題を避けるにはclearstatcache()関数でキャッシュをクリアしてください。この関数はあくまで存在を確認するだけで、読み書きの権限までは調べないため、ファイル操作を行う前にはis_readable()などで別途権限の確認を推奨します。

PHPでファイル長さを検証する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 指定されたファイルの内容を読み込み、期待される長さであるか検証します。
7 *
8 * この関数は、file_get_contents() を使用してファイルからデータを読み込みます。
9 * 読み込んだデータの長さが期待値と異なる場合、LengthException をスローします。
10 * この例外オブジェクトからは、getFile() メソッドを通じてエラーが発生したファイル名を取得できます。
11 *
12 * @param string $filepath       検証するファイルのパス
13 * @param int    $expectedLength 期待されるコンテンツの長さ (バイト単位)
14 * @return string                ファイルの内容 (長さが一致する場合)
15 * @throws LengthException       ファイルの内容の長さが期待値と異なる場合
16 * @throws RuntimeException      ファイルの読み込みに失敗した場合
17 */
18function readFileWithLengthCheck(string $filepath, int $expectedLength): string
19{
20    // file_get_contents() でファイルの内容を文字列として読み込む
21    // @ をつけているのは、ファイルが存在しない等のエラーをPHPの警告ではなく例外として処理するため
22    $content = @file_get_contents($filepath);
23
24    if ($content === false) {
25        // ファイルの読み込みに失敗した場合
26        throw new RuntimeException("ファイルの読み込みに失敗しました: {$filepath}");
27    }
28
29    // 読み込んだコンテンツの長さをチェック
30    if (strlen($content) !== $expectedLength) {
31        // 長さが期待値と異なる場合は LengthException をスローする
32        throw new LengthException("ファイルコンテンツの長さが期待値 ({$expectedLength} bytes) と異なります。");
33    }
34
35    return $content;
36}
37
38// --- 以下、サンプルコードの実行部分 ---
39
40// テスト用のファイル名と内容を定義
41$testFile = 'test_data.txt';
42$testContent = 'Hello, PHP!'; // 長さは 11 バイト
43
44// テスト用のファイルを作成
45file_put_contents($testFile, $testContent);
46
47echo "テストファイル '{$testFile}' を作成しました。\n";
48echo "ファイルの内容: '{$testContent}' (長さ: " . strlen($testContent) . " bytes)\n\n";
49
50try {
51    // わざと期待する長さを間違えて関数を呼び出し、例外を発生させる
52    echo "長さが 20 バイトであることを期待してファイルを読み込みます...\n";
53    $content = readFileWithLengthCheck($testFile, 20);
54    echo "成功: " . $content . "\n";
55} catch (LengthException $e) {
56    // LengthException をキャッチした場合の処理
57    echo "エラー: LengthException がキャッチされました。\n";
58    echo "メッセージ: " . $e->getMessage() . "\n";
59
60    // Exception クラスから継承された getFile() メソッドで、
61    // 例外がスローされたファイル名 (このスクリプト自身のファイル名) を取得して表示する
62    echo "発生ファイル: " . $e->getFile() . "\n";
63    echo "発生ライン: " . $e->getLine() . "\n";
64} catch (RuntimeException $e) {
65    // その他の実行時エラーをキャッチした場合
66    echo "エラー: RuntimeException がキャッチされました。\n";
67    echo "メッセージ: " . $e->getMessage() . "\n";
68} finally {
69    // テスト用のファイルを削除
70    if (file_exists($testFile)) {
71        unlink($testFile);
72        echo "\nテストファイル '{$testFile}' を削除しました。\n";
73    }
74}

PHPのLengthExceptionは、値の長さが不正な場合に発生する例外です。この例外オブジェクトは、親クラスであるExceptionからgetFile()というメソッドを継承しています。getFile()メソッドは引数を取らず、戻り値として例外が発生したPHPスクリプトのファイル名を文字列で返します。

サンプルコードでは、file_get_contents()関数でファイルの内容を文字列として読み込み、その長さが期待値と異なる場合にLengthExceptionを発生させる関数を定義しています。実行部分では、意図的に間違った長さを指定してこの関数を呼び出し、例外を発生させています。try...catch構文でこの例外を捕まえ、受け取った例外オブジェクトのgetFile()メソッドを実行することで、どのファイルでエラーが起きたか(この場合は実行しているスクリプト自身のファイル名)を知ることができます。このようにgetFile()メソッドは、プログラムのどこで問題が発生したかを特定するデバッグ作業で役立ちます。

file_get_contentsの先頭にある@は、ファイルが存在しない等の警告を抑制し、戻り値がfalseかどうかでエラーを判断するための記号です。例外処理において、$e->getFile()メソッドが返すのは、例外が作られた場所、つまりこのサンプルコード自身のファイル名です。エラーの原因となった読み込み対象のファイル名ではない点に注意が必要です。また、strlen()は文字列のバイト数を返します。日本語のようなマルチバイト文字の「文字数」を数えたい場合はmb_strlen()を使うなど、目的に応じた関数選択が大切です。エラー発生の有無にかかわらず後片付けを実行するfinallyブロックは、安全なプログラムに欠かせない要素です。

関連コンテンツ

関連プログラミング言語