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

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

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

作成日: 更新日:

基本的な使い方

isExecutableメソッドは、FilesystemIteratorクラスに属し、現在のイテレータが指すファイルまたはディレクトリが実行可能であるかどうかを判定するメソッドです。このメソッドは、ファイルシステム上の特定の項目が、オペレーティングシステムによって実行を許可されている状態にあるかを調べます。具体的には、Unix系システムではファイルの実行権限('x'ビット)が設定されているかを、Windowsシステムでは該当ファイルが実行可能なファイルタイプであるか、または実行許可があるかなどを確認します。

isExecutableメソッドは引数を取らず、結果を真偽値として返します。現在の項目が実行可能である場合はtrueを、そうでない場合はfalseを返します。この機能は、例えばディレクトリ内のファイルリストから実行可能なスクリプトやプログラムのみを選別したり、ユーザーが特定の操作を実行する前に必要な権限があるかを確認したりする際に非常に有用です。ファイルシステムのセキュリティ管理や、ユーザーインターフェースで実行可能な項目を視覚的に区別するようなアプリケーション開発において、正確かつ安全なファイル操作を実現するために重要な役割を果たします。

構文(syntax)

1<?php
2$iterator = new FilesystemIterator('/path/to/some/directory');
3$isExecutable = $iterator->isExecutable();
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

指定されたファイルが実行可能である場合に true を、そうでない場合に false を返します。

サンプルコード

PHP FilesystemIterator::isExecutable で実行可能か確認する

1<?php
2
3/**
4 * FilesystemIterator::isExecutable() メソッドの動作を実演する関数。
5 * 指定されたディレクトリとその中の一時ファイルを作成し、
6 * 各ファイルが実行可能であるかどうかをチェックします。
7 *
8 * @param string $path テスト用の一時ディレクトリのパス
9 */
10function demonstrateFilesystemIteratorIsExecutable(string $path = __DIR__ . DIRECTORY_SEPARATOR . 'temp_test_dir'): void
11{
12    // 1. テスト用のディレクトリを作成
13    if (!is_dir($path)) {
14        mkdir($path);
15        echo "テストディレクトリを作成しました: {$path}\n";
16    }
17
18    // 2. 実行可能なファイルをシミュレートするためのファイルを作成
19    //    POSIX系OS (Linux, macOS) では実行権限を設定します。
20    //    Windowsではファイルの内容や拡張子によって実行可能と判断されることがあります。
21    $executableFile = $path . DIRECTORY_SEPARATOR . 'my_script.sh';
22    file_put_contents($executableFile, '#!/bin/bash' . "\n" . 'echo "Hello from script!"');
23    if (PHP_OS_FAMILY === 'Linux' || PHP_OS_FAMILY === 'BSD' || PHP_OS_FAMILY === 'Darwin') {
24        // POSIXシステムでは実行権限 (0755) を付与
25        chmod($executableFile, 0755);
26        echo "実行可能ファイル '{$executableFile}' を作成し、実行権限を付与しました (0755)。\n";
27    } else {
28        echo "実行可能と見なされるファイル '{$executableFile}' を作成しました。\n";
29    }
30
31    // 3. 実行可能ではないファイルをシミュレートするためのファイルを作成
32    $textFile = $path . DIRECTORY_SEPARATOR . 'my_text.txt';
33    file_put_contents($textFile, 'これは単なるテキストファイルです。');
34    if (PHP_OS_FAMILY === 'Linux' || PHP_OS_FAMILY === 'BSD' || PHP_OS_FAMILY === 'Darwin') {
35        // POSIXシステムでは実行権限なし (0644) に設定
36        chmod($textFile, 0644);
37        echo "テキストファイル '{$textFile}' を作成し、実行権限を剥奪しました (0644)。\n";
38    } else {
39        echo "実行可能ではないファイル '{$textFile}' を作成しました。\n";
40    }
41
42    echo "\n--- ディレクトリ '{$path}' 内の実行可能性をチェックします ---\n";
43
44    try {
45        // FilesystemIterator を使用して、指定されたディレクトリ内の要素を反復処理します。
46        // - FilesystemIterator::KEY_AS_PATHNAME: キーを要素のフルパスに設定します。
47        // - FilesystemIterator::CURRENT_AS_FILEINFO: 現在の要素を SplFileInfo オブジェクトとして取得します。
48        // - FilesystemIterator::SKIP_DOTS: "." と ".." ディレクトリをスキップします。
49        $iterator = new FilesystemIterator(
50            $path,
51            FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS
52        );
53
54        // ディレクトリ内の各要素 (ファイルやサブディレクトリ) をループ処理
55        foreach ($iterator as $fileInfo) {
56            // isExecutable() メソッドを使用して、現在の要素が実行可能かチェック
57            if ($fileInfo->isExecutable()) {
58                echo "ファイル: '{$fileInfo->getFilename()}' は実行可能です。\n";
59            } else {
60                echo "ファイル: '{$fileInfo->getFilename()}' は実行可能ではありません。\n";
61            }
62        }
63    } catch (UnexpectedValueException $e) {
64        // 指定されたパスが存在しない、またはディレクトリでない場合に発生するエラーを処理
65        echo "エラー: ディレクトリを読み込めませんでした: " . $e->getMessage() . "\n";
66    } finally {
67        // 4. 後処理: 作成した一時ファイルとディレクトリを削除
68        echo "\n--- 一時ファイルのクリーンアップを実行します ---\n";
69        if (file_exists($executableFile)) {
70            unlink($executableFile);
71            echo "削除しました: {$executableFile}\n";
72        }
73        if (file_exists($textFile)) {
74            unlink($textFile);
75            echo "削除しました: {$textFile}\n";
76        }
77        if (is_dir($path)) {
78            rmdir($path);
79            echo "ディレクトリを削除しました: {$path}\n";
80        }
81    }
82}
83
84// 関数の実行
85demonstrateFilesystemIteratorIsExecutable();

PHP 8のFilesystemIterator::isExecutable()メソッドは、ファイルやディレクトリがシステム上で実行可能であるかどうかを判定するために使用されます。このメソッドは引数を取らず、戻り値として真偽値(bool)を返します。ファイルが実行可能な場合はtrue、そうでない場合はfalseを返します。

システムエンジニアにとって、ファイルの実行可能性はセキュリティやプログラムの動作に深く関わる重要な要素です。例えば、LinuxなどのPOSIX系OSでは、ファイルの実行権限(パーミッション)が設定されているかどうかが判断基準となります。Windowsでは、ファイルの種類や拡張子(.exe.batなど)によって実行可能と見なされることが多いです。

サンプルコードでは、まず一時的なディレクトリと、実行可能ファイル(シェルスクリプトに実行権限を付与)と実行可能ではないファイル(テキストファイル)を作成しています。その後、FilesystemIteratorを利用してこのディレクトリ内の各ファイルを順に走査し、それぞれのファイルに対してisExecutable()メソッドを呼び出して実行可能かどうかを判定し、その結果を表示しています。これにより、プログラムで動的にファイルの実行可能性を確認する方法を実演しています。

このサンプルコードは、FilesystemIterator::isExecutable()がファイルやディレクトリの実行可能性を判定する方法を示しています。特に注意すべき点は、実行可能かどうかの判定基準がOSによって異なることです。UNIX系OSではファイルパーミッションが主な基準ですが、Windowsでは拡張子や内容が影響し、期待と異なる結果になる場合があります。FilesystemIteratorを利用する際は、指定するフラグが反復処理の挙動に大きく影響するため、それぞれの意味を理解することが重要です。また、ファイルシステム操作では、対象パスの有無や権限によるエラー(UnexpectedValueExceptionなど)を適切に処理し、一時的に作成したリソースはfinallyブロックなどで必ずクリーンアップする習慣をつけましょう。

PHP: FilesystemIterator::isExecutable() で実行可能か判定する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * FilesystemIterator::isExecutable() メソッドの使用例を示します。
7 * このメソッドは、FilesystemIterator が現在指しているファイルまたはディレクトリが
8 * 実行可能であるかどうかをチェックします。
9 *
10 * システムエンジニアを目指す初心者向けに、一時的なファイルを作成・削除し、
11 * その実行権限がどのように判定されるかを示します。
12 */
13function demonstrateFilesystemIteratorIsExecutable(): void
14{
15    echo "--- FilesystemIterator::isExecutable() デモンストレーション ---" . PHP_EOL;
16
17    // 1. テスト用に一時ディレクトリとファイルを作成します。
18    //   - 実行権限を付与するファイル
19    //   - 実行権限を付与しないファイル
20    //   - ディレクトリ
21    $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid('php_exec_test_');
22
23    if (!mkdir($tempDir) && !is_dir($tempDir)) {
24        echo "エラー: 一時ディレクトリ '{$tempDir}' の作成に失敗しました。" . PHP_EOL;
25        return;
26    }
27    echo "一時ディレクトリ '{$tempDir}' を作成しました。" . PHP_EOL;
28
29    $executableScriptPath = $tempDir . DIRECTORY_SEPARATOR . 'my_script.sh';
30    $plainFilePath = $tempDir . DIRECTORY_SEPARATOR . 'document.txt';
31    $subDirPath = $tempDir . DIRECTORY_SEPARATOR . 'sub_dir';
32
33    // 実行可能なスクリプトファイルを作成
34    file_put_contents($executableScriptPath, "#!/bin/bash" . PHP_EOL . "echo 'Hello from my_script.sh'");
35    // 実行権限 (rwxr-xr-x) を設定
36    // Windows環境では、この権限が直接「実行可能」にマッピングされない場合がありますが、
37    // PHPのisExecutableはOSレベルでのチェックを試みます。
38    chmod($executableScriptPath, 0755);
39    echo "ファイル '{$executableScriptPath}' を作成し、実行権限を設定しました。" . PHP_EOL;
40
41    // 実行不可能なテキストファイルを作成
42    file_put_contents($plainFilePath, "これは通常のテキストファイルです。");
43    // 読み書き可能だが実行不可 (rw-r--r--) な権限を設定
44    chmod($plainFilePath, 0644);
45    echo "ファイル '{$plainFilePath}' を作成し、実行不可に設定しました。" . PHP_EOL;
46
47    // サブディレクトリを作成
48    mkdir($subDirPath);
49    // ディレクトリもアクセス・移動のため実行権限が考慮されることがあります
50    chmod($subDirPath, 0755);
51    echo "ディレクトリ '{$subDirPath}' を作成しました。" . PHP_EOL;
52
53    echo PHP_EOL . "--- FilesystemIterator で項目を走査し、実行可能性をチェック ---" . PHP_EOL;
54
55    try {
56        // 2. FilesystemIterator を使用して一時ディレクトリを走査します。
57        //    FilesystemIterator::KEY_AS_PATHNAME は、イテレータのキーを
58        //    ファイルのフルパス名にするフラグです。
59        $iterator = new FilesystemIterator($tempDir, FilesystemIterator::KEY_AS_PATHNAME);
60
61        foreach ($iterator as $path => $fileInfo) {
62            $filename = $fileInfo->getFilename();
63            // isExecutable() メソッドを呼び出し、実行可能かどうかを判定します。
64            $isExecutable = $fileInfo->isExecutable();
65
66            echo "項目: '{$filename}' (タイプ: " . ($fileInfo->isDir() ? "ディレクトリ" : "ファイル") . ")" . PHP_EOL;
67            echo "  実行可能ですか?: " . ($isExecutable ? "はい" : "いいえ") . PHP_EOL;
68            echo "--------------------------------------------------" . PHP_EOL;
69        }
70    } catch (UnexpectedValueException $e) {
71        // 不正なパスが指定された場合などに発生する可能性があります。
72        echo "エラー: FilesystemIterator の初期化に失敗しました: " . $e->getMessage() . PHP_EOL;
73    } finally {
74        // 3. デモンストレーションの終了後、作成したファイルとディレクトリをクリーンアップします。
75        echo PHP_EOL . "--- クリーンアップ中 ---" . PHP_EOL;
76        @unlink($executableScriptPath); // @ はエラー抑制演算子。ファイルが存在しない場合でも警告を出さない。
77        @unlink($plainFilePath);
78        @rmdir($subDirPath); // サブディレクトリを削除
79        @rmdir($tempDir);    // メインの一時ディレクトリを削除
80        echo "クリーンアップが完了しました。" . PHP_EOL;
81    }
82
83    echo "--- デモンストレーション終了 ---" . PHP_EOL;
84}
85
86// 関数の実行
87demonstrateFilesystemIteratorIsExecutable();

PHP 8のFilesystemIterator::isExecutable()メソッドは、ファイルシステムを走査するFilesystemIteratorが現在指しているファイルやディレクトリが、実行可能であるかを判定する際に使用します。このメソッドは引数を一切取らず、実行可能であればtrueを、そうでなければfalseを真偽値として返します。

提供されたサンプルコードでは、まずテスト用の一時ディレクトリを作成し、その中に実行権限を付与したスクリプトファイル、実行権限のないテキストファイル、そしてサブディレクトリを準備します。次にFilesystemIteratorを用いてこれらの項目を一つずつ走査し、各項目に対してisExecutable()メソッドを呼び出して実行可能かどうかを判定し、その結果を表示しています。これにより、ファイルの種類や設定された権限がisExecutable()の判定にどのように影響するのかを具体的に確認できます。特に、ディレクトリに対する「実行権限」は、そのディレクトリの内容にアクセスしたり、中を移動したりするための重要な権限として扱われます。デモンストレーションの終了後には、作成した一時ファイルやディレクトリは自動的にクリーンアップされ、システムをきれいに保ちます。この機能は、特定の実行権限を持つファイルを効率的に見つけ出すなど、ファイルシステムの管理やセキュリティ関連の処理に役立ちます。

FilesystemIterator::isExecutable()はOSやファイルシステムに依存して実行可否を判定するため、特にWindows環境ではUnix系OSと異なる挙動を示す場合があります。chmod()で実行権限を付与する際は、セキュリティリスクを考慮し、必要最小限のファイルに限定してください。また、一時ファイルやディレクトリを作成するデモコードでは、finallyブロックを活用してプログラム終了時に確実に削除することが重要です。これにより、システムに不要なリソースが残されるのを防ぎ、クリーンな状態を保つことができます。

関連コンテンツ

関連IT用語

関連プログラミング言語