【PHP8.x】is_dir()関数の使い方
is_dir関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
is_dir関数は、指定されたパスが既存のディレクトリであるかどうかを判断するPHPの組み込み関数です。この関数は、引数として検査したいパスの文字列を一つ受け取ります。もしそのパスが実際に存在するディレクトリを指していればtrue(真)を返し、そうでなければfalse(偽)を返します。
例えば、あるファイルシステム上で特定のフォルダが存在するかどうかを確認したい場合に非常に役立ちます。falseが返されるケースには、指定されたパスが存在しない場合、パスがディレクトリではなくファイルである場合、あるいはPHPがそのパスにアクセスする権限を持っていない場合などが含まれます。
ファイルやディレクトリの操作を行う前に、対象が意図した種類のパスであるかを確認することで、予期せぬエラーを防ぎ、堅牢なプログラムを作成することができます。特に、ユーザーからの入力パスを扱う際には、セキュリティと安定性の観点から、この関数を用いてパスの検証を行うことが推奨されます。この関数はファイルシステム操作の基本的な機能の一つとして、多くのPHPアプリケーションで利用されています。
構文(syntax)
1<?php 2$path = __DIR__; // このスクリプトが存在するディレクトリのパス 3$isItADirectory = is_dir($path); 4var_dump($isItADirectory); 5?>
引数(parameters)
string $filename
- string $filename: 存在を確認したいディレクトリのパスを指定する文字列
戻り値(return)
bool
指定されたパスがディレクトリであれば true を、そうでなければ false を返します。
サンプルコード
PHP: is_dir()でディレクトリか判定する
1<?php 2 3/** 4 * 指定されたパスがディレクトリであるかを確認するサンプル関数。 5 * is_dir()関数の基本的な使い方と挙動を示します。 6 */ 7function checkDirectoryExamples(): void 8{ 9 // 現在のスクリプトがあるディレクトリ内に一時ディレクトリを作成 10 $tempDirPath = __DIR__ . '/test_directory'; 11 // 存在しないパスの例 12 $nonExistentPath = __DIR__ . '/non_existent_path'; 13 // 現在のスクリプトファイルのパス (これはディレクトリではない) 14 $filePath = __FILE__; 15 16 // テスト用にディレクトリが存在しない場合は作成 17 if (!is_dir($tempDirPath)) { 18 mkdir($tempDirPath); 19 echo "情報: テスト用のディレクトリ '{$tempDirPath}' を作成しました。" . PHP_EOL; 20 } 21 22 echo "--- is_dir() 関数の使用例 ---" . PHP_EOL; 23 24 // 1. 存在するディレクトリのパスをチェック 25 echo "パス: '{$tempDirPath}'" . PHP_EOL; 26 if (is_dir($tempDirPath)) { 27 echo " 結果: ディレクトリです。" . PHP_EOL; 28 } else { 29 echo " 結果: ディレクトリではありません。" . PHP_EOL; 30 } 31 echo PHP_EOL; 32 33 // 2. 存在しないパスをチェック 34 echo "パス: '{$nonExistentPath}'" . PHP_EOL; 35 if (is_dir($nonExistentPath)) { 36 echo " 結果: ディレクトリです。" . PHP_EOL; 37 } else { 38 echo " 結果: ディレクトリではありません。" . PHP_EOL; 39 } 40 echo PHP_EOL; 41 42 // 3. ファイルのパスをチェック (is_dir()はファイルに対してはfalseを返す) 43 echo "パス: '{$filePath}'" . PHP_EOL; 44 if (is_dir($filePath)) { 45 echo " 結果: ディレクトリです。" . PHP_EOL; 46 } else { 47 echo " 結果: ディレクトリではありません。" . PHP_EOL; 48 } 49 echo PHP_EOL; 50 51 // テスト用に作成したディレクトリを削除 (後処理) 52 if (is_dir($tempDirPath)) { 53 rmdir($tempDirPath); 54 echo "情報: テスト用のディレクトリ '{$tempDirPath}' を削除しました。" . PHP_EOL; 55 } 56} 57 58// サンプル関数を実行 59checkDirectoryExamples(); 60 61?>
PHPのis_dir関数は、指定されたパスが既存のディレクトリであるかどうかを判定するために使用されます。この関数は、引数として確認したいパスを文字列で受け取ります。例えば、/path/to/my_directoryのようなファイルシステムのパスを指定します。
戻り値は真偽値(bool型)で、指定されたパスが実際に存在するディレクトリであればtrueを返し、そうでない場合(例えば、ファイルである場合や、パス自体が存在しない場合など)はfalseを返します。
サンプルコードでは、is_dir関数の具体的な挙動が示されています。まず、一時的なディレクトリを作成し、その存在するディレクトリに対してis_dirを適用すると、「ディレクトリです」と表示され、trueが返されることがわかります。次に、存在しないパスや、ファイルであるパスに対してis_dirを適用した場合は、「ディレクトリではありません」と表示され、falseが返されることを確認できます。これにより、ファイルシステム上でのパスの種類を確実に判別し、安全にファイル操作を進めるための条件分岐に活用できます。
is_dir()関数は、指定したパスがディレクトリの場合にtrueを返します。注意点として、パスが存在しない場合や、ファイルである場合も同様にfalseを返すため、これらを区別できません。パスの存在自体を確認したい場合は、file_exists()関数を先に使うのが確実です。また、Webサーバーなどの環境では、PHPを実行するユーザーにディレクトリへのアクセス権限(パーミッション)がないと、ディレクトリが実際に存在していてもfalseが返ることがあります。PHPはパフォーマンス向上のためファイルの状態をキャッシュするので、ループ処理などで状態が変わりうる場合はclearstatcache()関数でキャッシュをクリアする必要があることにも留意してください。
PHPでディレクトリが空か判定する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたパスが空のディレクトリであるかどうかを判定します。 7 * 8 * is_dir() を使用して、まずパスが有効なディレクトリであることを確認します。 9 * その後、ディレクトリ内に '.' と '..' 以外のファイルやサブディレクトリが 10 * 存在しないことを効率的にチェックします。 11 * 12 * @param string $path チェックするディレクトリのパス。 13 * @return bool ディレクトリが存在し、かつ空である場合は true、そうでない場合は false を返します。 14 */ 15function isDirectoryEmpty(string $path): bool 16{ 17 // is_dir() で、指定されたパスがディレクトリでない、または存在しない場合、処理を中断 18 if (!is_dir($path)) { 19 return false; 20 } 21 22 // FilesystemIterator を使ってディレクトリをスキャンする準備をします。 23 // FilesystemIterator::SKIP_DOTS を指定すると、'.' と '..' を自動的に無視できます。 24 $iterator = new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS); 25 26 // valid() は、イテレータが有効な項目(ファイルやサブディレクトリ)を指しているかを返します。 27 // 最初の時点で valid() が false を返す場合、ディレクトリには中身がないことを意味します。 28 return !$iterator->valid(); 29} 30 31// --- 以下、サンプルコードの動作確認 --- 32 33// 1. テスト用のディレクトリとファイルを準備 34$emptyDir = __DIR__ . '/test_dir_empty'; 35$notEmptyDir = __DIR__ . '/test_dir_not_empty'; 36$fileInDir = $notEmptyDir . '/dummy.txt'; 37$notADirectory = __DIR__ . '/not_a_directory.txt'; 38 39// 事前にクリーンアップ 40if (file_exists($fileInDir)) unlink($fileInDir); 41if (is_dir($notEmptyDir)) rmdir($notEmptyDir); 42if (is_dir($emptyDir)) rmdir($emptyDir); 43if (file_exists($notADirectory)) unlink($notADirectory); 44 45// テスト用のディレクトリとファイルを作成 46mkdir($emptyDir); 47mkdir($notEmptyDir); 48file_put_contents($fileInDir, 'test content'); 49file_put_contents($notADirectory, 'test content'); 50 51 52// 2. 関数を実行して結果を確認 53echo "--- ディレクトリが空かどうかの判定結果 ---" . PHP_EOL; 54 55echo "判定対象: '{$emptyDir}' (空のディレクトリ)" . PHP_EOL; 56var_dump(isDirectoryEmpty($emptyDir)); // 期待値: bool(true) 57 58echo PHP_EOL; 59 60echo "判定対象: '{$notEmptyDir}' (空ではないディレクトリ)" . PHP_EOL; 61var_dump(isDirectoryEmpty($notEmptyDir)); // 期待値: bool(false) 62 63echo PHP_EOL; 64 65echo "判定対象: 'non_existent_dir' (存在しないディレクトリ)" . PHP_EOL; 66var_dump(isDirectoryEmpty('non_existent_dir')); // 期待値: bool(false) 67 68echo PHP_EOL; 69 70echo "判定対象: '{$notADirectory}' (ファイル)" . PHP_EOL; 71var_dump(isDirectoryEmpty($notADirectory)); // 期待値: bool(false) 72 73 74// 3. 後片付け 75unlink($fileInDir); 76rmdir($notEmptyDir); 77rmdir($emptyDir); 78unlink($notADirectory); 79
このサンプルコードは、PHPのis_dir関数を利用して、指定されたパスが空のディレクトリであるかを判定するisDirectoryEmpty関数を定義しています。PHP 8のis_dir関数は、引数に指定された$filenameパスが実際にディレクトリであるかを調べ、その結果をtrueまたはfalseのブール値で返します。
isDirectoryEmpty関数は、まずis_dir()を使って、引数で与えられた$pathが有効なディレクトリであるかを確認します。これにより、ディレクトリではないファイルや存在しないパスに対して誤った判定がされることを防ぎます。パスがディレクトリであることを確認した後、FilesystemIteratorという機能を使ってディレクトリ内部をスキャンします。この際、FilesystemIterator::SKIP_DOTSという設定を加えることで、現在のディレクトリを示す「.」や親ディレクトリを示す「..」といった特殊な項目を自動的に無視し、実際のファイルやサブディレクトリのみを対象とします。最終的に、スキャンした結果「.」や「..」以外の有効な項目が一つも存在しない場合に、そのディレクトリは空であると判断しtrueを返します。
isDirectoryEmpty関数の引数$pathには確認したいディレクトリのパスを文字列で渡し、戻り値は、ディレクトリが存在し、かつ空であればtrue、それ以外の場合はfalseを返します。
is_dir()は、引数のパスが存在し、かつディレクトリであるかを厳密に判定します。ファイルや存在しないパスではfalseを返すため、対象がディレクトリであることを確認する際に利用します。ディレクトリが空かを確認する際は、.と..といった特殊なエントリをFilesystemIterator::SKIP_DOTSオプションで効率的に無視できることを理解しましょう。実際のシステムでは、指定パスへの読み取り権限不足によりエラーが発生する可能性があります。そのため、ファイルシステム権限とパスの正確性を常に確認し、堅牢なエラーハンドリングを検討することが重要です。
PHPでディレクトリの存在を確認する
1<?php 2 3/** 4 * このスクリプトは、指定されたパスが既存のディレクトリであるかどうかを 5 * is_dir() 関数を使用して確認する方法を示します。 6 * 7 * is_dir() は、PHPのリファレンス情報にある通り、引数に指定されたパスが 8 * ディレクトリであり、かつそのディレクトリが存在する場合に true を返します。 9 * それ以外の場合 (ファイル、存在しないパスなど) は false を返します。 10 */ 11 12// 存在するディレクトリのパスをチェック 13// このスクリプトが実行されている現在のディレクトリを指します。 14$existingDirPath = __DIR__; 15 16// 存在しないディレクトリのパスをチェック 17$nonExistingDirPath = __DIR__ . '/non_existent_directory_123'; 18 19// 存在するファイルのパスをチェック (is_dir() はファイルには false を返します) 20// このスクリプト自身のファイルパスを使用します。 21$filePath = __FILE__; 22 23echo "--- is_dir() の使用例 ---" . PHP_EOL; 24 25// 存在するディレクトリのチェック 26if (is_dir($existingDirPath)) { 27 echo "'{$existingDirPath}' は存在するディレクトリです。" . PHP_EOL; 28} else { 29 echo "'{$existingDirPath}' はディレクトリではないか、存在しません。" . PHP_EOL; 30} 31 32// 存在しないディレクトリのチェック 33if (is_dir($nonExistingDirPath)) { 34 echo "'{$nonExistingDirPath}' は存在するディレクトリです。" . PHP_EOL; 35} else { 36 echo "'{$nonExistingDirPath}' はディレクトリではないか、存在しません。" . PHP_EOL; 37} 38 39// ファイルのチェック (is_dir() は false を返すべきです) 40if (is_dir($filePath)) { 41 echo "'{$filePath}' は存在するディレクトリです。" . PHP_EOL; 42} else { 43 echo "'{$filePath}' はディレクトリではないか、存在しません。" . PHP_EOL; 44} 45 46echo PHP_EOL . "--- 補足 ---" . PHP_EOL; 47echo "is_dir() はシンボリックリンクに対しても、そのリンクが指す先がディレクトリであれば true を返します。" . PHP_EOL; 48 49?>
PHPのis_dir関数は、ファイルシステム上で指定されたパスが「既存のディレクトリ」であるかを確認するために利用します。この関数には、確認したいディレクトリのパスを文字列型 (string) の引数として渡します。戻り値は真偽値 (bool) であり、パスが実際に存在するディレクトリを指していればtrueを返し、それ以外の場合(ファイル、存在しないパス、またはディレクトリではないもの)はfalseを返します。
サンプルコードでは、まず__DIR__定数で示される「現在のディレクトリ」のような、実在するディレクトリのパスに対してis_dirがtrueを返すことを確認します。次に、存在しないディレクトリのパスや、__FILE__定数で示される「ファイル」のパスを渡した場合には、is_dirがfalseを返すことを示しています。これは、ファイルが存在してもそれがディレクトリではないため、is_dirはfalseと判断することを意味します。補足として、is_dir関数はシンボリックリンクに対しても、そのリンク先がディレクトリであればtrueを返します。この関数を用いることで、プログラムがファイル操作を行う前に、対象が正しくディレクトリであるかを確実に判別できます。
is_dir() 関数は、引数に指定されたパスが「実際に存在するディレクトリ」である場合にのみ true を返します。パスがファイルである場合や、そもそも存在しないパスの場合には false となりますので、ファイルかどうかを確認する目的では利用できません。シンボリックリンクを渡した場合、そのリンクが指す先がディレクトリであれば true を返します。ファイルの存在確認には is_file()、ファイルかディレクトリかを問わずパスが存在するかを確認するには file_exists() を使うなど、目的に応じて関数を使い分けることで、より意図が明確で安全なコードになります。
PHP is_dir() の使い方と注意点
1<?php 2 3/** 4 * PHPのis_dir()関数の使用例と、 5 * 「is_dir()が期待通りに動作しない」と感じる一般的なケースをデモンストレーションします。 6 * 7 * is_dir()は、指定されたパスが実際に存在するディレクトリである場合にのみ true を返します。 8 * パスが存在しない場合やファイルである場合、false を返します。 9 */ 10function demonstrateIsDirUsage(): void 11{ 12 $basePath = __DIR__; 13 $testDirPath = $basePath . DIRECTORY_SEPARATOR . 'sample_dir_for_is_dir_test'; 14 $testFilePath = $basePath . DIRECTORY_SEPARATOR . 'sample_file_for_is_dir_test.txt'; 15 16 // 既存のテストファイルを削除 17 if (file_exists($testFilePath)) { 18 unlink($testFilePath); 19 } 20 // 既存のテストディレクトリを削除 21 if (is_dir($testDirPath)) { 22 rmdir($testDirPath); 23 } 24 25 // テスト用ディレクトリを作成 26 if (!mkdir($testDirPath, 0777, true)) { 27 echo "エラー: テスト用ディレクトリ '{$testDirPath}' の作成に失敗しました。権限を確認してください。\n"; 28 return; 29 } 30 echo "作成: '{$testDirPath}'\n"; 31 32 // テスト用ファイルを作成 33 if (file_put_contents($testFilePath, 'これはテストファイルです。') === false) { 34 echo "エラー: テスト用ファイル '{$testFilePath}' の作成に失敗しました。権限を確認してください。\n"; 35 } else { 36 echo "作成: '{$testFilePath}'\n"; 37 } 38 39 echo "\n--- is_dir() の結果 ---\n"; 40 41 // 1. 存在するディレクトリのパス 42 echo "パス: '{$testDirPath}'\n"; 43 echo " is_dir() は " . (is_dir($testDirPath) ? 'true' : 'false') . " を返しました。\n"; 44 echo " → 存在するディレクトリなので true が期待されます。\n\n"; 45 46 // 2. 存在しないパス 47 $nonExistentPath = $basePath . DIRECTORY_SEPARATOR . 'non_existent_directory'; 48 echo "パス: '{$nonExistentPath}'\n"; 49 echo " is_dir() は " . (is_dir($nonExistentPath) ? 'true' : 'false') . " を返しました。\n"; 50 echo " → パスが存在しないため false が返されます。これが「not working」と感じる一般的な原因です。\n\n"; 51 52 // 3. 存在するが、ディレクトリではなくファイルのパス 53 echo "パス: '{$testFilePath}'\n"; 54 echo " is_dir() は " . (is_dir($testFilePath) ? 'true' : 'false') . " を返しました。\n"; 55 echo " → パスがファイルであるため false が返されます。これも「not working」と感じる原因です。\n"; 56 echo " ファイルかどうかの確認には is_file() を使用します。\n\n"; 57 58 // 4. アクセス権限がない可能性のあるパス (補足) 59 // PHPプロセスにディレクトリへの読み取り権限がない場合、 60 // is_dir() は false を返すことがあります。 61 // これも「not working」と感じる原因の一つです。 62 63 echo "--- クリーンアップ ---\n"; 64 if (file_exists($testFilePath)) { 65 unlink($testFilePath); 66 echo "削除: '{$testFilePath}'\n"; 67 } 68 if (is_dir($testDirPath)) { 69 rmdir($testDirPath); 70 echo "削除: '{$testDirPath}'\n"; 71 } 72} 73 74// デモンストレーション関数を実行します。 75demonstrateIsDirUsage();
PHPのis_dir()関数は、指定されたパスが実際に「ディレクトリ(フォルダ)」であるかどうかを判定する関数です。引数としてstring $filenameに調べたいパスを渡すと、そのパスが存在し、かつそれがディレクトリであればtrueを、そうでなければfalseをブール値で返します。
この関数が「期待通りに動作しない(not working)」と感じる一般的なケースがいくつかあります。まず、指定したパスが存在しない場合、is_dir()はfalseを返します。これはディレクトリが存在しないため正しい挙動ですが、パスの指定ミスなどを見落としがちです。次に、パスは存在するものの、それがディレクトリではなく通常の「ファイル」である場合も、is_dir()はfalseを返します。ファイルであるかを確認したい場合は、is_file()関数を使用する必要があります。
サンプルコードでは、実際に存在するディレクトリのパス、存在しないパス、そして存在するがファイルであるパスのそれぞれに対してis_dir()を実行し、その結果を示しています。これにより、is_dir()がtrueを返すのは、パスが存在し、かつそれがディレクトリである場合のみという挙動が明確になります。PHPがそのパスへのアクセス権限を持っていない場合もfalseを返すことがあるため、権限の確認も重要です。
is_dir()関数は、指定されたパスが「存在し、かつディレクトリである」場合にのみtrueを返します。パスが存在しない場合や、指定されたパスがファイルである場合はfalseを返します。これが「is_dir()が期待通りに動作しない」と感じる主な理由です。ファイルの存在確認にはfile_exists()、ファイルかどうかの確認にはis_file()を使い分ける必要があります。また、PHPを実行するプロセスに対象ディレクトリへの適切なアクセス権限があるかどうかも重要です。権限がない場合もfalseが返されることがあるため、環境設定を確認してください。