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

【PHP8.x】DirectoryIterator::__construct()メソッドの使い方

__constructメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

__constructメソッドは、DirectoryIteratorクラスの新しいインスタンスを初期化し、指定されたディレクトリの内容を反復処理できるように準備するメソッドです。このメソッドは、DirectoryIteratorオブジェクトを作成する際に必ず呼び出され、どのディレクトリの情報を取得し、その中のファイルやサブディレクトリを操作できるようにするかを決定します。

具体的には、引数として操作対象となるディレクトリのパスを文字列で指定します。例えば、現在のディレクトリを示す「.」や、特定のパス「/var/www/html」のような絶対パスまたは相対パスを渡すことができます。このメソッドが正常に実行されると、指定されたディレクトリ内の個々のエントリ(ファイルやサブディレクトリ)にアクセスするためのDirectoryIteratorオブジェクトが生成されます。

一度オブジェクトが作成されれば、PHPのforeachループなどを使用して、ディレクトリの内容を順に走査し、各エントリの名前、タイプ(ファイルかディレクトリか)、サイズ、最終更新日時などの情報を簡単に取得できるようになります。ただし、指定されたパスが存在しないディレクトリである場合や、PHPスクリプトがそのディレクトリに対する適切な読み取り権限を持たない場合は、RuntimeExceptionなどの例外がスローされるため注意が必要です。このメソッドは、ファイルシステムをプログラムから効率的に探索し、その内容を処理するための重要な出発点となります。

構文(syntax)

1new DirectoryIterator(string $path)

引数(parameters)

string $directory

  • string $directory: 検索対象のディレクトリパスを指定する文字列

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

DirectoryIterator コンストラクタでディレクトリを操作する

1<?php
2
3/**
4 * DirectoryIterator クラスのコンストラクタ (__construct) の使用例。
5 *
6 * このスクリプトは、指定されたディレクトリのイテレータを初期化し、
7 * ディレクトリ内のファイルとフォルダの名前を表示します。
8 *
9 * DirectoryIterator クラスの __construct メソッドは、新しい DirectoryIterator オブジェクトを作成する際に
10 * 実行され、引数として指定されたディレクトリへのパスを受け取ります。
11 */
12
13// 現在のスクリプトがあるディレクトリのパスを取得します。
14// '__DIR__' は、現在のファイルのディレクトリパスを表すマジック定数です。
15$directoryPath = __DIR__;
16
17echo "対象ディレクトリ: " . $directoryPath . PHP_EOL;
18echo "------------------------------------" . PHP_EOL;
19
20try {
21    // DirectoryIterator の新しいインスタンスを作成します。
22    // ここで __construct メソッドが呼び出され、指定された $directoryPath でイテレータが初期化されます。
23    $iterator = new DirectoryIterator($directoryPath);
24
25    echo "ディレクトリ内の項目一覧:" . PHP_EOL;
26    // イテレータを使用して、ディレクトリ内の各ファイルやサブディレクトリをループ処理します。
27    foreach ($iterator as $fileinfo) {
28        // 各項目の名前(ファイル名またはディレクトリ名)を取得して表示します。
29        echo $fileinfo->getFilename() . PHP_EOL;
30    }
31} catch (UnexpectedValueException $e) {
32    // 指定されたパスが存在しない、ディレクトリではない、または読み取り権限がない場合に発生する例外を処理します。
33    echo "エラー: 指定されたパスが正しくないか、アクセスできません。" . PHP_EOL;
34    echo "詳細: " . $e->getMessage() . PHP_EOL;
35} catch (Exception $e) {
36    // その他の予期せぬ例外を処理します。
37    echo "予期せぬエラーが発生しました。" . PHP_EOL;
38    echo "詳細: " . $e->getMessage() . PHP_EOL;
39}
40
41?>

PHPのDirectoryIteratorクラスは、特定のディレクトリに存在するファイルやサブディレクトリの情報を効率的に扱うための機能を提供します。このクラスの__constructメソッドは、クラスの新しい「インスタンス」(実体)を作成する際に、必ず最初に自動的に呼び出される特別なメソッドで、「コンストラクタ」と呼ばれます。

__constructメソッドは、引数としてstring $directoryを受け取ります。この引数には、対象となるディレクトリへのパスを文字列で指定します。例えば、/path/to/my_directoryのように指定することで、DirectoryIteratorオブジェクトがそのディレクトリの内容を読み込むための準備を行います。コンストラクタはオブジェクトの初期化が主な役割であるため、特定の値を戻すことはありません。

サンプルコードでは、まず__DIR__というPHPの定数を使って、現在のスクリプトが置かれているディレクトリのパスを取得しています。次に、$iterator = new DirectoryIterator($directoryPath);という行でDirectoryIteratorの新しいオブジェクトを生成する際に、先ほど説明した__constructメソッドが呼び出され、現在のディレクトリがイテレータの対象として設定されます。その後、foreachループを使用することで、初期化されたイテレータが参照するディレクトリ内の全てのファイルやサブディレクトリの名前を順番に取得し、画面に表示しています。指定されたディレクトリが存在しないなどのエラーが発生した際にプログラムが停止しないよう、try-catch文で適切に例外を処理しています。

DirectoryIteratorのコンストラクタは、引数に指定されたディレクトリパスでイテレータを初期化します。このパスは、実際に存在し、かつPHPスクリプトが読み取り権限を持つ必要があります。もしパスが誤っていたり、アクセス権がない場合はUnexpectedValueExceptionが発生するため、サンプルコードのようにtry-catchブロックで例外処理を適切に行うことが非常に重要です。これにより、プログラムの予期せぬ終了を防ぎ、エラーをユーザーに分かりやすく伝えられます。また、将来的にユーザーからの入力をパスとして使用する場合は、ディレクトリトラバーサルなどのセキュリティリスクを避けるため、パスの検証とサニタイズを必ず実施してください。

PHP DirectoryIterator クラスのコンストラクタでディレクトリを操作する

1<?php
2
3/**
4 * DirectoryIterator クラスのコンストラクタ (__construct) の使用例を示します。
5 *
6 * このスクリプトは、一時的なディレクトリを作成し、その内容を DirectoryIterator を使って
7 * リストアップし、最後にディレクトリをクリーンアップします。
8 */
9
10// 一時的なテストディレクトリのパスを定義します。
11$testDirectory = __DIR__ . '/sample_dir_for_iterator';
12
13// ディレクトリが存在しない場合は作成し、テスト用のファイルとサブディレクトリを追加します。
14if (!file_exists($testDirectory)) {
15    mkdir($testDirectory);
16    file_put_contents($testDirectory . '/document.txt', 'Sample text content.');
17    file_put_contents($testDirectory . '/image.jpg', 'Binary image data placeholder.');
18    mkdir($testDirectory . '/subfolder');
19    file_put_contents($testDirectory . '/subfolder/nested_file.txt', 'Nested file content.');
20    echo "テストディレクトリ '{$testDirectory}' とその内容を作成しました。\n";
21} else {
22    echo "既存のテストディレクトリ '{$testDirectory}' を使用します。\n";
23}
24
25echo "\n--- 指定されたディレクトリの内容一覧 ---\n";
26
27try {
28    // ここで DirectoryIterator クラスの新しいインスタンスを作成します。
29    // この時点で DirectoryIterator::__construct メソッドが呼び出され、
30    // 引数として渡されたディレクトリ ($testDirectory) を操作するための初期設定が行われます。
31    // コンストラクタは新しい DirectoryIterator オブジェクトを返します。
32    $iterator = new DirectoryIterator($testDirectory);
33
34    // foreach ループを使って、ディレクトリ内の各要素(ファイルやサブディレクトリ)を順番に処理します。
35    foreach ($iterator as $fileInfo) {
36        // '.' と '..' は特殊なディレクトリ参照なのでスキップします。
37        if ($fileInfo->isDot()) {
38            continue;
39        }
40
41        // 各要素がディレクトリかファイルかを判断し、その名前を表示します。
42        // getFilename() メソッドで要素の名前を取得できます。
43        if ($fileInfo->isDir()) {
44            echo "  [ディレクトリ]: " . $fileInfo->getFilename() . "\n";
45        } else {
46            echo "  [ファイル]:     " . $fileInfo->getFilename() . " (サイズ: " . $fileInfo->getSize() . " バイト)\n";
47        }
48    }
49    echo "-------------------------------------\n";
50
51} catch (UnexpectedValueException $e) {
52    // 指定されたディレクトリが存在しない、または読み取り権限がない場合にこの例外が発生します。
53    echo "エラー: ディレクトリの読み込みに失敗しました: " . $e->getMessage() . "\n";
54} finally {
55    // サンプル用に作成したディレクトリとその内容をクリーンアップします。
56    // この部分はサンプルコードの実行後に環境を元の状態に戻すためのものです。
57    if (file_exists($testDirectory . '/subfolder/nested_file.txt')) {
58        unlink($testDirectory . '/subfolder/nested_file.txt');
59    }
60    if (file_exists($testDirectory . '/subfolder')) {
61        rmdir($testDirectory . '/subfolder');
62    }
63    if (file_exists($testDirectory . '/document.txt')) {
64        unlink($testDirectory . '/document.txt');
65    }
66    if (file_exists($testDirectory . '/image.jpg')) {
67        unlink($testDirectory . '/image.jpg');
68    }
69    if (file_exists($testDirectory)) {
70        rmdir($testDirectory);
71        echo "\nテストディレクトリ '{$testDirectory}' およびその内容をクリーンアップしました。\n";
72    }
73}
74
75?>

DirectoryIterator::__constructは、PHPのDirectoryIteratorクラスの「コンストラクタ」と呼ばれる特別なメソッドです。コンストラクタは、newキーワードを使って新しいオブジェクトを生成する際に自動的に呼び出され、そのオブジェクトの初期設定を行う役割を担います。

このメソッドにはstring $directoryという引数が一つ必要です。これは、DirectoryIteratorオブジェクトが操作する対象となるディレクトリのパスを文字列として指定するためのものです。例えば、特定のフォルダの内容を読み込みたい場合に、そのフォルダの場所をこの引数で渡します。

コンストラクタ自体は明示的な値を直接戻り値として返しません。しかし、その実行が完了すると、引数で指定したディレクトリを扱うための準備が整った新しいDirectoryIteratorオブジェクトが生成され、new演算子の結果として利用可能になります。

サンプルコードでは、$iterator = new DirectoryIterator($testDirectory); の行で__constructメソッドが呼び出されています。ここで$testDirectoryに格納されたパス(作成した一時ディレクトリ)が引数として渡され、そのディレクトリを走査するための$iteratorオブジェクトが初期化されます。この初期化された$iteratorオブジェクトを用いることで、その後のforeachループでディレクトリ内のファイルやサブディレクトリを効率的にリストアップすることが可能になります。指定されたディレクトリが存在しない場合や読み取り権限がない場合には、エラー(UnexpectedValueException)が発生します。

DirectoryIterator::__constructは、指定されたディレクトリを操作するための準備を行う特別なメソッドです。引数には、実際に存在するディレクトリのパスを文字列で渡す必要があります。指定したディレクトリが存在しない場合や、読み取り権限がない場合はUnexpectedValueExceptionが発生するため、try-catchブロックで適切にエラーを処理することが重要です。ディレクトリを一覧表示する際は、「.」と「..」という特殊なエントリを除外する処理を忘れずに入れてください。また、サンプルコードのように一時的なファイルやディレクトリを作成した場合は、処理の最後に必ず削除し、環境をきれいに保つよう注意してください。セキュリティのため、ユーザーからの入力パスを直接使用する際は、必ず検証とサニタイズを行ってください。

関連コンテンツ