【PHP8.x】dir関数の使い方
dir関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
dir関数は、指定されたパスのディレクトリをオープンし、そのディレクトリ内のエントリを操作するためのオブジェクトを返す関数です。この関数は、ディレクトリの読み取り、巻き戻し、およびクローズといった一連の操作を、オブジェクト指向的な方法で実行することを可能にします。
引数には、オープンしたいディレクトリのパスを文字列で渡します。正常にディレクトリがオープンできた場合、dir関数はDirectoryクラスのインスタンスを返します。このDirectoryオブジェクトは、ディレクトリの内容を順番に読み取るためのread()メソッド、ディレクトリポインタを先頭に戻すためのrewind()メソッド、そしてオープンしたディレクトリハンドルを閉じるためのclose()メソッドを持っています。
例えば、ディレクトリ内のファイルやサブディレクトリの名前を一つずつ取得したい場合に、read()メソッドをループ内で繰り返し呼び出すことで、効率的に処理を進めることができます。全ての読み取りが完了したら、close()メソッドを呼び出してリソースを解放することが推奨されます。
もし指定されたディレクトリが存在しない場合や、読み取り権限がないなどの理由でオープンに失敗した場合、dir関数はfalseを返します。そのため、この関数の戻り値は必ず確認し、エラーハンドリングを行うことが重要です。PHP 8では、より明確な型情報と共に、これらの操作が提供されており、ディレクトリ操作を簡潔かつ安全に行うための強力なツールとなります。
構文(syntax)
1<?php 2function dir(string $path): array 3{ 4 return scandir($path); 5} 6 7$directoryContents = dir('/var/www/html'); 8?>
引数(parameters)
string $directory, ?resource $context = null
- string $directory: ディレクトリのパスを指定する文字列
- ?resource $context: ストリームコンテキストを指定するリソース (省略可能)
戻り値(return)
Directory|false
指定されたディレクトリを開いた Directory オブジェクト、またはエラーが発生した場合は false を返します。
サンプルコード
PHP dir()でディレクトリ一覧を取得する
1<?php 2 3/** 4 * 指定されたディレクトリの内容を一覧表示します。 5 * 6 * この関数は、OSに依存しないディレクトリ区切り文字である 7 * DIRECTORY_SEPARATOR 定数を使用してパスを構築し、 8 * dir() 関数を使ってディレクトリの内容を読み込みます。 9 * 10 * @return void 11 */ 12function listDirectoryContents(): void 13{ 14 // --- 準備: テスト用のディレクトリとファイルを作成 --- 15 // カレントディレクトリ配下に 'sample_dir' という名前のディレクトリパスを構築します。 16 // DIRECTORY_SEPARATOR を使うことで、Windows (\) でも Linux/macOS (/) でも正しく動作します。 17 $dirName = 'sample_dir'; 18 $path = __DIR__ . DIRECTORY_SEPARATOR . $dirName; 19 20 // ディレクトリとファイルが存在しないことを確認してから作成します。 21 if (!is_dir($path)) { 22 mkdir($path); 23 } 24 file_put_contents($path . DIRECTORY_SEPARATOR . 'file1.txt', 'test1'); 25 file_put_contents($path . DIRECTORY_SEPARATOR . 'file2.log', 'test2'); 26 // ---------------------------------------------------- 27 28 echo "ディレクトリ '{$dirName}' の内容を読み込みます..." . PHP_EOL; 29 30 // dir() 関数でディレクトリハンドルを開きます。 31 // 失敗した場合は false が返るため、処理を中断します。 32 if (($d = dir($path)) === false) { 33 echo "ディレクトリ '{$path}' を開けませんでした。" . PHP_EOL; 34 // 後片付け処理へ 35 } else { 36 // try-finally ブロックで、処理の最後に必ず後片付けが行われるようにします。 37 try { 38 // while ループと read() メソッドで、ディレクトリ内のエントリを1つずつ読み込みます。 39 // 読み込むエントリがなくなると read() は false を返します。 40 while (false !== ($entry = $d->read())) { 41 // '.' (カレントディレクトリ) と '..' (親ディレクトリ) は除外します。 42 if ($entry === '.' || $entry === '..') { 43 continue; 44 } 45 echo $entry . PHP_EOL; 46 } 47 } finally { 48 // 必ずディレクトリハンドルを閉じます。 49 $d->close(); 50 } 51 } 52 53 // --- 後片付け: 作成したファイルとディレクトリを削除 --- 54 unlink($path . DIRECTORY_SEPARATOR . 'file1.txt'); 55 unlink($path . DIRECTORY_SEPARATOR . 'file2.log'); 56 rmdir($path); 57 echo "テスト用のディレクトリとファイルを削除しました。" . PHP_EOL; 58} 59 60// 関数を実行します。 61listDirectoryContents();
PHPのdir()関数は、指定したディレクトリの内容を順次読み込むための機能を提供します。最初の引数$directoryには、読み込みたいディレクトリのパスを文字列で指定します。$contextはオプションの引数で、特定のストリームコンテキストを指定できますが、通常は省略します。関数が成功するとDirectoryクラスのオブジェクトが返され、このオブジェクトを通じてディレクトリ内のファイルやサブディレクトリ名を取得できます。失敗した場合はfalseが返されます。
サンプルコードでは、まずDIRECTORY_SEPARATOR定数を使ってOSに依存しないディレクトリパスを構築し、テスト用のディレクトリとファイルを準備しています。その後、dir()関数で指定パスのディレクトリハンドルを開き、返されたDirectoryオブジェクトのread()メソッドをループで呼び出すことで、ディレクトリ内のエントリ名を一つずつ取得しています。この際、カレントディレクトリを表す.と親ディレクトリを表す..はスキップしています。全ての読み込みが完了したら、close()メソッドで必ずディレクトリハンドルを閉じます。これはfinallyブロックを用いて、処理の途中でエラーが発生しても確実に閉じられるようにしています。最後に、テスト用に作成したディレクトリとファイルを削除し、後片付けを行っています。
PHPのdir()関数を利用する際は、OSに依存しないパスを構築するためDIRECTORY_SEPARATOR定数を使用することが非常に重要です。dir()関数は、指定したディレクトリを開くのに失敗するとfalseを返すため、必ず戻り値をチェックし、適切なエラー処理を行うようにしてください。成功するとDirectoryオブジェクトが返され、read()メソッドでディレクトリ内のエントリを読み込みますが、この際、カレントディレクトリを示す.と親ディレクトリを示す..も含まれるため、必要に応じてこれらを除外する処理を記述しましょう。そして最も大切なのは、処理が終了したらclose()メソッドを呼び出し、必ずディレクトリハンドルを閉じてリソースを解放することです。これを忘れるとリソースリークの原因となるため、try-finallyブロックを活用し、確実に実行するように心がけてください。
PHP dirname関数でパスの親ディレクトリを取得する
1<?php 2 3/** 4 * 指定されたパスからディレクトリ名を取得するdirname()関数の使用例を示します。 5 * システムエンジニアにとって、ファイルパス操作は基本的なスキルです。 6 * この関数は、ファイルの親ディレクトリパスを効率的に取得するのに役立ちます。 7 * 8 * @param string $path ディレクトリ名を取得したいパス。ファイルでもディレクトリでも可。 9 * @return void 10 */ 11function demonstrateDirname(string $path): void 12{ 13 echo "元のパス: " . $path . "\n"; 14 15 // 1. 基本的な使用法: パスの親ディレクトリを取得 16 // 例: '/var/www/html/index.php' -> '/var/www/html' 17 $parentDirectory = dirname($path); 18 echo "親ディレクトリ: " . $parentDirectory . "\n"; 19 20 // 2. 複数レベル上の親ディレクトリを取得 (PHP 7.0.0 以降で利用可能) 21 // 第二引数に取得したいレベル数を指定します。 22 // 例: '/var/www/html/index.php' の2レベル上 -> '/var/www' 23 $grandparentDirectory = dirname($path, 2); 24 echo "2レベル上の親ディレクトリ: " . $grandparentDirectory . "\n"; 25 26 // 3. ディレクトリパスの場合 27 // パスがスラッシュで終わっていても、正しく親ディレクトリを返します。 28 // 例: '/var/www/html/' -> '/var/www' 29 if (str_ends_with($path, '/')) { // PHP 8.0 以降の関数 30 echo "ディレクトリパスの場合 (例: {$path}): " . dirname($path) . "\n"; 31 } 32 33 echo "----------------------------------------\n"; 34} 35 36// サンプルパスで関数を実行 37demonstrateDirname('/usr/local/bin/php/my_script.php'); 38demonstrateDirname('/etc/nginx/nginx.conf'); 39demonstrateDirname('/var/www/html/'); 40demonstrateDirname('C:\\xampp\\htdocs\\index.php'); // Windowsパス形式もサポート 41demonstrateDirname('just_a_file.txt'); // カレントディレクトリを示す'.'を返す 42 43?>
PHPのdirname()関数は、指定されたファイルやディレクトリのパスから、その親ディレクトリのパスを文字列として取得するために使用されます。システムエンジニアにとってファイルパスの操作は基本的なスキルであり、この関数はパスの階層構造を効率的に扱う上で非常に役立ちます。
第一引数$pathには、親ディレクトリ名を取得したい対象のパス(文字列)を指定します。このパスはファイルのものでもディレクトリのものでも構いません。第二引数(PHP 7.0以降で利用可能)には、何レベル上の親ディレクトリを取得したいかを整数で指定でき、デフォルト値は1です。
戻り値は、親ディレクトリのパスを表す文字列です。例えば、/var/www/html/index.phpのようなパスを指定すると、その親ディレクトリである/var/www/htmlが返されます。第二引数に2を指定すれば、2レベル上の親ディレクトリ/var/wwwを取得するといった応用も可能です。パスがスラッシュで終わるディレクトリパスの場合や、Windows形式のパス(例: C:\xampp\htdocs\index.php)も正しく処理します。ファイル名のみが指定された場合(例: just_a_file.txt)は、カレントディレクトリを示す.を返します。このようにdirname()は、プログラム内でファイルパスを解析し、適切なディレクトリパスを導き出す際に非常に有用な関数です。
dirname()関数は、指定パスの親ディレクトリ名を返しますが、利用に際していくつかの注意点があります。パスがスラッシュで終わるディレクトリの場合でも、その1階層上のディレクトリ名を返します。ファイル名のみを渡した場合は、カレントディレクトリを示す「.」が返されるため、この挙動を理解しておくことが重要です。PHP 7.0以降では、第二引数で複数階層上の親ディレクトリを取得できます。この関数はパス文字列を処理するもので、パスが実際に存在するかは確認しません。したがって、ファイルの存在確認が必要な場合は別途行う必要があります。Windows、UNIXどちらのパス形式にも対応しています。