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

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

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

作成日: 更新日:

基本的な使い方

getPermsメソッドは、FilesystemIteratorクラスに属し、現在のイテレータが指し示すファイルまたはディレクトリのパーミッション(アクセス権)を取得するメソッドです。パーミッションとは、ファイルやディレクトリに対して、誰がどのような操作(読み込み、書き込み、実行など)を行えるかを定義する情報のことです。

このメソッドは、UNIX系システムで一般的に用いられるパーミッション情報を、整数値として返します。返される整数値は、ビットマスクとしてエンコードされており、ファイルの所有者、所属グループ、およびその他のユーザーに対する読み込み、書き込み、実行の権限を示します。例えば、所有者にすべての権限があり、グループとその他に読み込みと実行権限がある場合、このメソッドは特定の整数値を返します。この整数値は、通常、八進数(例: 0755)として解釈されることで、具体的な権限の内容を把握できます。

getPermsメソッドの戻り値は、PHPの標準的なstat()関数やfileperms()関数が返すパーミッション情報と同じ形式であるため、これらの関数と組み合わせて扱うことも可能です。システムエンジニアにとって、ファイルやディレクトリへのアクセス制御は非常に重要であり、このメソッドはプログラムでファイルシステム上の要素のアクセス権限を確認し、それに応じた適切な処理を実行するために役立ちます。

構文(syntax)

1<?php
2
3$iterator = new FilesystemIterator(__DIR__);
4
5foreach ($iterator as $fileInfo) {
6    $permissions = $fileInfo->getPerms();
7    printf("ファイル名: %s, パーミッション: %o\n", $fileInfo->getFilename(), $permissions);
8    break;
9}

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

FilesystemIterator::getPermsは、現在のディレクトリまたはファイルのパーミッション(アクセス権)を整数値で返します。

サンプルコード

PHP FilesystemIterator getPerms でパーミッションを取得する

1<?php
2
3/**
4 * FilesystemIterator::getPerms() メソッドの使用例を示します。
5 *
6 * この関数は一時ファイルを作成し、FilesystemIterator を使用してそのファイルのパーミッションを
7 * 整数値で取得し、表示します。最後に一時ファイルを削除します。
8 *
9 * PHP 8 環境を想定しています。
10 */
11function demonstrateFilesystemIteratorGetPerms(): void
12{
13    // 一時ファイルの名前とパスを定義
14    $testFileName = 'temp_file_for_perms_test.txt';
15    $testFilePath = __DIR__ . DIRECTORY_SEPARATOR . $testFileName;
16    $directoryPath = __DIR__;
17
18    // --- 準備: テストファイルを作成 ---
19    // ファイルが存在しない場合は作成し、シンプルな内容を書き込みます。
20    // file_put_contents は成功時に書き込んだバイト数を、失敗時に false を返します。
21    if (file_put_contents($testFilePath, "これはパーミッション取得のテストファイルです。\n") === false) {
22        echo "エラー: テストファイル '{$testFileName}' の作成に失敗しました。\n";
23        return;
24    }
25    echo "情報: テストファイル '{$testFileName}' を作成しました。\n";
26
27    // 作成したファイルのパーミッションを明示的に設定します。
28    // 例: 所有者には読み書き(6)、グループとその他には読み取りのみ(4)。八進数表記で0644。
29    // 注意: Windows環境ではchmodの機能は限定的です。
30    if (!chmod($testFilePath, 0644)) {
31        echo "警告: テストファイル '{$testFileName}' のパーミッション設定に失敗しました。\n";
32        echo "    システムのデフォルトパーミッションが使用されます。\n";
33    }
34
35    // --- FilesystemIterator と getPerms() の使用 ---
36    try {
37        // FilesystemIterator のインスタンスを作成します。
38        // FilesystemIterator::SKIP_DOTS フラグは、'.' と '..' エントリをスキップするために使用します。
39        $iterator = new FilesystemIterator($directoryPath, FilesystemIterator::SKIP_DOTS);
40
41        $foundPerms = null;
42        // ディレクトリ内の各ファイルをイテレートします。
43        foreach ($iterator as $fileInfo) {
44            // 現在のファイルが、作成したテストファイルであるかを確認します。
45            if ($fileInfo->getFilename() === $testFileName) {
46                // FilesystemIterator::getPerms() メソッドを呼び出し、
47                // 現在のファイルのパーミッションを整数値で取得します。
48                $perms = $iterator->getPerms();
49                $foundPerms = $perms;
50
51                echo "結果: ファイル '{$fileInfo->getFilename()}' のパーミッション:\n";
52                echo "    八進数表記: " . decoct($perms) . " (例: 644, 755 など)\n";
53                echo "    整数値: {$perms}\n";
54                break; // 目的のファイルを見つけたので、ループを終了します。
55            }
56        }
57
58        if ($foundPerms === null) {
59            echo "エラー: FilesystemIterator がテストファイル '{$testFileName}' を見つけられませんでした。\n";
60        }
61
62    } catch (UnexpectedValueException $e) {
63        // ディレクトリが見つからない、またはアクセスできない場合のエラーハンドリング
64        echo "エラー: ディレクトリ '{$directoryPath}' を開けませんでした。メッセージ: " . $e->getMessage() . "\n";
65    } finally {
66        // --- 後処理: テストファイルを削除 ---
67        // try-catch ブロックの終了時に必ず実行される finally ブロックでファイルを削除します。
68        if (file_exists($testFilePath)) {
69            if (unlink($testFilePath)) {
70                echo "情報: テストファイル '{$testFileName}' を正常に削除しました。\n";
71            } else {
72                echo "エラー: テストファイル '{$testFileName}' の削除に失敗しました。\n";
73            }
74        }
75    }
76}
77
78// サンプル関数を実行します。
79demonstrateFilesystemIteratorGetPerms();
80

PHPのFilesystemIterator::getPerms()は、ファイルやディレクトリのアクセス権限、つまりパーミッションを整数値で取得するためのメソッドです。このメソッドはFilesystemIteratorクラス内で、ディレクトリ内の各ファイル情報を順に処理する際に、そのファイルのパーミッション情報を取得します。引数はなく、戻り値としてパーミッションを表す整数値を返します。

サンプルコードでは、まず一時ファイルを準備し、特定のパーミッション(例として八進数0644)を設定しています。次に、FilesystemIteratorを使って現在のディレクトリを走査し、作成した一時ファイルを探します。目的のファイルが見つかると、$iterator->getPerms()を呼び出してファイルのパーミッションを整数値で取得します。この整数値は、ファイル権限の八進数表記(例: 644や755)を数値化したものです。例えば、decoct()関数を使うと一般的な八進数表記に変換して表示でき、所有者、グループ、その他のユーザーに対する読み書き実行の権限が具体的にわかります。最後に、作成した一時ファイルを確実に削除する後処理も含まれており、ファイルへのアクセス権をプログラムで確認し、それに基づいて処理を制御するのに役立ちます。

FilesystemIterator::getPerms()は、現在イテレータが指すファイルのパーミッションを整数値で取得します。一般的に利用される八進数表記(例:644)に変換するには、decoct()関数を使用してください。

このサンプルコードは、一時ファイルの作成からパーミッション設定、FilesystemIteratorでのファイル探索とパーミッション取得、そして一時ファイルの削除までの一連の流れを示しています。特にchmod()関数はWindows環境では機能が限定されるため、設定したパーミッションが意図通りに反映されない可能性がある点に注意が必要です。

ファイルやディレクトリの操作は失敗する可能性があるため、file_put_contents()unlink()の戻り値を確認し、try-catch-finallyブロックを用いて例外処理と必ず行うべき後処理(一時ファイルの削除など)を記述することが重要です。作成した一時ファイルは、処理後に必ず削除し、システムをきれいに保つように心がけてください。

PHP: URLからパス指定でパーミッション表示

1<?php
2
3/**
4 * URLパラメータからディレクトリパスを取得し、
5 * そのディレクトリ内の各ファイルおよびサブディレクトリのパーミッションを表示する関数。
6 *
7 * このサンプルは、FilesystemIterator クラスを使用してディレクトリの内容をイテレートし、
8 * 各エントリ(SplFileInfo オブジェクト)からパーミッションを取得する方法を示します。
9 * 初心者向けに簡潔化されており、実運用ではより厳格なパス検証とセキュリティ対策が必要です。
10 */
11function displayDirectoryPermissionsFromUrl(): void
12{
13    // URLから 'path' パラメータを取得。指定がない場合はカレントディレクトリ '.' をデフォルトとする。
14    // 例: http://localhost/script.php?path=/var/www/html
15    $requestedPath = $_GET['path'] ?? '.';
16
17    // 取得したパスが存在し、かつディレクトリであるかを確認
18    if (!is_dir($requestedPath)) {
19        echo "Error: '{$requestedPath}' は有効なディレクトリではないか、存在しません。\n";
20        return;
21    }
22
23    // パスの絶対パスを取得し、セキュリティ上の問題(例: ドットスラッシュ攻撃)を軽減
24    // realpath() はシンボリックリンクを解決し、正規化された絶対パスを返します。
25    $absolutePath = realpath($requestedPath);
26    if ($absolutePath === false) {
27        echo "Error: パス '{$requestedPath}' を解決できませんでした。\n";
28        return;
29    }
30
31    echo "<h2>ディレクトリ: {$absolutePath} のパーミッション</h2>\n";
32    echo "<pre>"; // 整形済みテキストとして表示するために <pre> タグを使用
33
34    try {
35        // FilesystemIterator を使用して指定されたディレクトリの内容をイテレートします。
36        // FilesystemIterator は、ディレクトリ内の各エントリに対して SplFileInfo オブジェクトを返します。
37        $iterator = new FilesystemIterator($absolutePath);
38
39        // ディレクトリが空であるか、アクセスできない場合に備える
40        if (!$iterator->valid()) {
41            echo "このディレクトリは空か、アクセスできません。\n";
42        } else {
43            // ディレクトリ内の各エントリについてループ処理
44            foreach ($iterator as $fileInfo) {
45                // SplFileInfo オブジェクトからパーミッション(権限)の整数値を取得します。
46                // この getPerms() メソッドは SplFileInfo クラスに属しています。
47                $perms = $fileInfo->getPerms();
48
49                // パーミッションの整数値を 'rwxrwxrwx' 形式の文字列に変換するヘルパー関数
50                $permString = getPermissionString($perms);
51
52                // ファイルまたはディレクトリの名前、パーミッション文字列、および8進数パーミッションを表示
53                echo sprintf(
54                    "%-30s %s (%s)\n",
55                    $fileInfo->getFilename(),  // エントリの名前
56                    $permString,               // rwxrwxrwx 形式のパーミッション
57                    decoct($perms & 0777)      // 8進数形式 (例: 755)
58                );
59            }
60        }
61    } catch (UnexpectedValueException $e) {
62        // FilesystemIterator の初期化に失敗した場合の例外処理
63        echo "エラー: ディレクトリ '{$absolutePath}' へのアクセスに失敗しました。 " . $e->getMessage() . "\n";
64    } catch (Exception $e) {
65        // その他の予期せぬエラーの例外処理
66        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
67    }
68
69    echo "</pre>";
70}
71
72/**
73 * ファイルパーミッションの整数値を 'rwxrwxrwx' 形式の文字列に変換する補助関数。
74 *
75 * @param int $perms パーミッションの整数値(SplFileInfo::getPerms() が返す値など)。
76 * @return string 'd rwx r-x r--' のような形式のパーミッション文字列。
77 */
78function getPermissionString(int $perms): string
79{
80    // ファイルタイプを判別するためのビットマスク
81    $type = '?';
82    switch ($perms & 0xF000) { // S_IFMT マスク
83        case 0xC000: $type = 's'; break; // ソケット
84        case 0xA000: $type = 'l'; break; // シンボリックリンク
85        case 0x8000: $type = '-'; break; // 通常のファイル
86        case 0x6000: $type = 'b'; break; // ブロックスペシャルファイル
87        case 0x4000: $type = 'd'; break; // ディレクトリ
88        case 0x2000: $type = 'c'; break; // キャラクタスペシャルファイル
89        case 0x1000: $type = 'p'; break; // 名前付きパイプ (FIFO)
90    }
91
92    // 所有者、グループ、その他のパーミッションビットを文字に変換
93    $owner = (($perms & 0x0100) ? 'r' : '-') . // 所有者: 読み取り
94             (($perms & 0x0080) ? 'w' : '-') . // 所有者: 書き込み
95             (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x') : (($perms & 0x0800) ? 'S' : '-')); // 所有者: 実行/set-user-ID
96    $group = (($perms & 0x0020) ? 'r' : '-') . // グループ: 読み取り
97             (($perms & 0x0010) ? 'w' : '-') . // グループ: 書き込み
98             (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x') : (($perms & 0x0400) ? 'S' : '-')); // グループ: 実行/set-group-ID
99    $other = (($perms & 0x0004) ? 'r' : '-') . // その他: 読み取り
100             (($perms & 0x0002) ? 'w' : '-') . // その他: 書き込み
101             (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x') : (($perms & 0x0200) ? 'T' : '-')); // その他: 実行/スティッキービット
102
103    return $type . $owner . $group . $other;
104}
105
106// スクリプトが直接実行された場合に、上記の関数を呼び出して処理を開始します。
107displayDirectoryPermissionsFromUrl();

このPHPサンプルコードは、URLパラメータで指定されたディレクトリパスに基づいて、そのディレクトリ内の各ファイルやサブディレクトリのパーミッション(権限)情報を表示するものです。

まず、$_GET['path']を使用してURLからディレクトリパスを取得し、セキュリティと正確性のためにis_dir()で存在確認を行い、realpath()で正規化された絶対パスへと変換しています。

次に、FilesystemIteratorクラスを用いて指定されたディレクトリ内の内容を一つずつイテレート(繰り返し処理)します。このイテレータは、ディレクトリ内の各エントリをSplFileInfoオブジェクトとして提供します。

コードの主要部分であるgetPerms()メソッドは、SplFileInfoオブジェクトから呼び出されます。このメソッドは引数を一切取らず、対象のファイルやディレクトリに設定されているパーミッションをUNIX形式の整数値(int型)として返します。この整数値は、読み取り(r)、書き込み(w)、実行(x)といった各種権限がビットとして格納されたものです。

取得したパーミッションの整数値は、補助関数getPermissionString()によって「rwxrwxrwx」のような人間が読みやすい形式の文字列に変換され、さらに8進数(例: 755)としても表示しています。これにより、各ファイルやディレクトリの具体的な権限設定を確認できます。エラーが発生した場合は、try-catchブロックで適切に処理し、ユーザーにメッセージを返します。

このサンプルコードはURLパラメータからパスを受け取るため、セキュリティ上の注意が必要です。実運用では、許可するパスを厳しく検証し、ホワイトリスト方式などで限定的なアクセスのみを許可する設計が不可欠です。realpath()関数はパスの正規化に役立ちますが、それだけで安全が保証されるわけではありません。getPerms()メソッドは、FilesystemIteratorが返すSplFileInfoオブジェクトに属しており、その戻り値はファイルの種類や読み書き実行権限などを含む整数値です。この整数値はそのままでは分かりにくいため、補助関数やdecoct()で整形して表示することが一般的です。ファイルシステムへのアクセスは、権限不足などによる例外発生の可能性があるため、try-catchで適切にエラーハンドリングを行うことが重要です。

関連コンテンツ

関連IT用語

関連プログラミング言語