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

【PHP8.x】GlobIterator::CURRENT_MODE_MASK定数の使い方

CURRENT_MODE_MASK定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURRENT_MODE_MASK定数は、PHPのGlobIteratorクラスに属し、ファイルシステムを反復処理する際に、現在処理中の要素(カレント要素)がどのような形式で返されるかを指定するモード設定に関連するビットマスクを表す定数です。

GlobIteratorは、特定のパターンに一致するファイルやディレクトリを効率的に検索し、それらを順次処理するための機能を提供します。この際、イテレータが各要素をどのように「表現」するか、例えば、ファイルに関する詳細な情報を持つオブジェクトとして取得するか、あるいは単にそのパス名として取得するかといった挙動を制御できます。

CURRENT_MODE_MASKは、具体的にGlobIterator::CURRENT_AS_FILEINFO(ファイル情報オブジェクトとして取得)、GlobIterator::CURRENT_AS_PATHNAME(パス名文字列として取得)、GlobIterator::CURRENT_AS_SELF(イテレータ自身として取得)といった、カレント要素の取得形式を決定するモード定数のグループを識別するためのものです。

これらのモード定数は、GlobIteratorオブジェクトのコンストラクタに引数として渡したり、setFlags()メソッドを通じて後から設定したりすることで、イテレータの動作を柔軟にカスタマイズするために利用されます。CURRENT_MODE_MASK定数自体が直接設定されることは稀ですが、これらのカレント要素の取得モードを指定する際に、どの設定が「現在の要素の形式」に関わるものかを識別するための内部的なマスクとして機能します。これにより、開発者は、ファイルシステムイテレーションのニーズに合わせて、返されるデータの形式を適切に選択できます。

構文(syntax)

1<?php
2echo GlobIterator::CURRENT_MODE_MASK;

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

GlobIterator::CURRENT_MODE_MASK は、GlobIterator::getMode() メソッドで取得できる現在のモードを表すビットマスクの定数です。

サンプルコード

PHP GlobIterator::CURRENT_MODE_MASK と current() の挙動

1<?php
2
3/**
4 * GlobIterator::CURRENT_MODE_MASK の働きと current() メソッドの挙動を示すサンプルコードです。
5 *
6 * GlobIterator::CURRENT_MODE_MASK は、GlobIterator が current() メソッドで返す値の形式を決定するフラグ
7 * (CURRENT_AS_PATHNAME, CURRENT_AS_FILEINFO, CURRENT_AS_SELF) を識別するために使用されるビットマスク定数です。
8 * この定数自体は直接モードを設定するのではなく、設定されたフラグからモード部分を抽出するために利用されます。
9 *
10 * @return void
11 */
12function runGlobIteratorCurrentModeMaskExample(): void
13{
14    // 一時的なディレクトリとファイルを作成します。GlobIteratorでイテレートする対象です。
15    $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'php_glob_test_' . uniqid('glob_');
16    mkdir($tempDir);
17    file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'file1.txt', 'content1');
18    file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'file2.log', 'content2');
19
20    echo "--- GlobIterator::CURRENT_MODE_MASK の働きと current() メソッド ---" . PHP_EOL . PHP_EOL;
21    echo "GlobIterator::CURRENT_MODE_MASK の値: " . GlobIterator::CURRENT_MODE_MASK . " (int)" . PHP_EOL . PHP_EOL;
22    echo "この定数は、GlobIterator が current() メソッドで何を返すかを制御するフラグを特定するためのマスクです。" . PHP_EOL;
23    echo "例えば、GlobIterator::CURRENT_AS_FILEINFO などのフラグを設定することで、current() の戻り値の型が変わります。" . PHP_EOL . PHP_EOL;
24
25    // 1. current() がファイルパスを文字列として返すモード (GlobIterator::CURRENT_AS_PATHNAME)
26    // このフラグは、通常デフォルトの挙動ですが、明示的に指定することで意図を明確にできます。
27    $flagsPathname = GlobIterator::CURRENT_AS_PATHNAME;
28    $iteratorPathname = new GlobIterator($tempDir . DIRECTORY_SEPARATOR . '*', $flagsPathname);
29
30    // 設定されたフラグから current() モード部分を抽出します。
31    // ビット論理積 (&) を使用して、CURRENT_MODE_MASK で指定されたビットのみを抽出します。
32    $currentModePathname = $flagsPathname & GlobIterator::CURRENT_MODE_MASK;
33
34    echo "--- current() がファイルパスを返す場合 (CURRENT_AS_PATHNAME) ---" . PHP_EOL;
35    echo "設定フラグ: GlobIterator::CURRENT_AS_PATHNAME (" . $flagsPathname . ")" . PHP_EOL;
36    echo "抽出された current() モード: " . $currentModePathname . PHP_EOL;
37    if ($currentModePathname === GlobIterator::CURRENT_AS_PATHNAME) {
38        echo "  -> current() メソッドはファイルパスを文字列として返します。" . PHP_EOL;
39        foreach ($iteratorPathname as $key => $value) {
40            echo "    Key: " . $key . ", Value: " . $value . " (型: " . gettype($value) . ")" . PHP_EOL;
41        }
42    }
43    echo PHP_EOL;
44
45    // 2. current() が SplFileInfo オブジェクトとして返すモード (GlobIterator::CURRENT_AS_FILEINFO)
46    $flagsFileinfo = GlobIterator::CURRENT_AS_FILEINFO;
47    $iteratorFileinfo = new GlobIterator($tempDir . DIRECTORY_SEPARATOR . '*', $flagsFileinfo);
48
49    // 設定されたフラグから current() モード部分を抽出します。
50    $currentModeFileinfo = $flagsFileinfo & GlobIterator::CURRENT_MODE_MASK;
51
52    echo "--- current() が SplFileInfo オブジェクトを返す場合 (CURRENT_AS_FILEINFO) ---" . PHP_EOL;
53    echo "設定フラグ: GlobIterator::CURRENT_AS_FILEINFO (" . $flagsFileinfo . ")" . PHP_EOL;
54    echo "抽出された current() モード: " . $currentModeFileinfo . PHP_EOL;
55    if ($currentModeFileinfo === GlobIterator::CURRENT_AS_FILEINFO) {
56        echo "  -> current() メソッドは SplFileInfo オブジェクトを返します。" . PHP_EOL;
57        foreach ($iteratorFileinfo as $key => $value) {
58            echo "    Key: " . $key . ", Value: " . $value->getFilename() . " (型: " . gettype($value) . ")" . PHP_EOL;
59        }
60    }
61    echo PHP_EOL;
62
63    // 3. current() が GlobIterator オブジェクト自身を返すモード (GlobIterator::CURRENT_AS_SELF)
64    $flagsSelf = GlobIterator::CURRENT_AS_SELF;
65    $iteratorSelf = new GlobIterator($tempDir . DIRECTORY_SEPARATOR . '*', $flagsSelf);
66
67    // 設定されたフラグから current() モード部分を抽出します。
68    $currentModeSelf = $flagsSelf & GlobIterator::CURRENT_MODE_MASK;
69
70    echo "--- current() が GlobIterator オブジェクト自身を返す場合 (CURRENT_AS_SELF) ---" . PHP_EOL;
71    echo "設定フラグ: GlobIterator::CURRENT_AS_SELF (" . $flagsSelf . ")" . PHP_EOL;
72    echo "抽出された current() モード: " . $currentModeSelf . PHP_EOL;
73    if ($currentModeSelf === GlobIterator::CURRENT_AS_SELF) {
74        echo "  -> current() メソッドは GlobIterator オブジェクト自身を返します。" . PHP_EOL;
75        foreach ($iteratorSelf as $key => $value) {
76            echo "    Key: " . $key . ", Value: " . get_class($value) . " (型: " . gettype($value) . ")" . PHP_EOL;
77        }
78    }
79    echo PHP_EOL;
80
81    // 一時ファイルとディレクトリをクリーンアップします。
82    unlink($tempDir . DIRECTORY_SEPARATOR . 'file1.txt');
83    unlink($tempDir . DIRECTORY_SEPARATOR . 'file2.log');
84    rmdir($tempDir);
85}
86
87// サンプルコードを実行します
88runGlobIteratorCurrentModeMaskExample();

PHPのGlobIterator::CURRENT_MODE_MASKは、GlobIteratorがファイルやディレクトリを繰り返し処理する際に、current()メソッドが返す値の形式(モード)を識別するための特別な整数定数です。この定数自体がcurrent()の挙動を直接設定するわけではありません。代わりに、GlobIteratorのコンストラクタに渡される様々なフラグの中から、current()の戻り値の形式を決定するビット部分を「抽出」するために利用されるビットマスクです。

たとえば、GlobIteratorにはCURRENT_AS_PATHNAME(ファイルパスを文字列として返す)、CURRENT_AS_FILEINFO(ファイル情報をSplFileInfoオブジェクトとして返す)、CURRENT_AS_SELFGlobIteratorオブジェクト自身を返す)といったモード設定用のフラグがあります。これらのフラグをGlobIterator::CURRENT_MODE_MASKとビット論理積(&)演算で組み合わせることで、現在設定されているcurrent()の戻り値モードをプログラム上で正確に判断できます。

current()メソッドは、イテレータの現在の要素を返す役割を持ち、設定されたモードフラグに基づいてその戻り値の型が変わります。CURRENT_MODE_MASKは、開発者がcurrent()の挙動を理解し、現在のモードをプログラム的に検証するために役立ちます。これにより、異なるモードに対応する柔軟なコードを書くことが可能になります。

GlobIterator::CURRENT_MODE_MASKは、GlobIteratorcurrent()メソッドで何を返すかのモードを設定するフラグを識別するためのビットマスク定数です。この定数自体がモードを設定するわけではなく、コンストラクタに渡されるフラグの中から、current()の戻り値の形式(パス名、SplFileInfo、自身)を示す部分だけを抽出するために利用されます。設定するフラグによってcurrent()の戻り値の型が文字列、SplFileInfoオブジェクト、またはGlobIteratorオブジェクト自身と変化するため、ループ内で値を利用する際には、常にその型に合わせた適切なプロパティやメソッドへのアクセスが必要です。サンプルコードは一時ファイルを扱いますが、実運用でファイルパスを指定する際には、意図しないファイル操作を防ぐため、対象パスの正確性に細心の注意を払ってください。

GlobIteratorでファイル更新日時を取得する

1<?php
2
3/**
4 * Executes a file search using GlobIterator and displays file modification timestamps.
5 *
6 * This function demonstrates how to use GlobIterator to find files, retrieve their
7 * modification timestamps, and explicitly uses GlobIterator::CURRENT_MODE_MASK
8 * to verify the current element's return mode. This links the file system iteration
9 * with the concept of "current timestamp" by displaying file modification times.
10 */
11function demonstrateGlobIteratorAndTimestamps(): void
12{
13    // 1. Create a temporary file for demonstration purposes.
14    $tempFileName = 'timestamp_demo_file_' . uniqid() . '.txt';
15    file_put_contents($tempFileName, 'This is a temporary file to demonstrate timestamp retrieval.');
16    echo "Created temporary file: " . $tempFileName . "\n\n";
17
18    try {
19        // 2. Initialize GlobIterator.
20        //    GlobIterator::CURRENT_AS_FILEINFO ensures that current() returns SplFileInfo objects,
21        //    which are necessary to get file modification time using getMTime().
22        $iterator = new GlobIterator($tempFileName, GlobIterator::CURRENT_AS_FILEINFO);
23
24        // 3. Get the flags currently set on the iterator.
25        $flags = $iterator->getFlags();
26
27        // 4. Use GlobIterator::CURRENT_MODE_MASK to isolate and check the mode-related flags.
28        //    This confirms that the iterator is configured to return SplFileInfo objects,
29        //    which is crucial for accessing file metadata like modification timestamps.
30        if (($flags & GlobIterator::CURRENT_MODE_MASK) === GlobIterator::CURRENT_AS_FILEINFO) {
31            echo "GlobIterator mode confirmed: Returns SplFileInfo objects (verified using CURRENT_MODE_MASK).\n";
32            echo "This allows access to detailed file information, including timestamps.\n\n";
33
34            if ($iterator->valid()) {
35                foreach ($iterator as $fileInfo) {
36                    /** @var SplFileInfo $fileInfo An object providing information about the file. */
37                    echo "Processing file: " . $fileInfo->getFilename() . "\n";
38
39                    // 5. Get the file modification timestamp (UNIX timestamp).
40                    $modificationTimestamp = $fileInfo->getMTime();
41                    echo "  Modification Timestamp (UNIX): " . $modificationTimestamp . "\n";
42
43                    // 6. Convert the UNIX timestamp to a human-readable format using DateTimeImmutable.
44                    $dateTime = new DateTimeImmutable("@" . $modificationTimestamp);
45                    echo "  Modification Date/Time: " . $dateTime->format('Y-m-d H:i:s') . "\n";
46                }
47            } else {
48                echo "No matching file found for pattern: " . $tempFileName . "\n";
49            }
50        } else {
51            echo "Error: GlobIterator is not configured to return SplFileInfo objects.\n";
52            echo "Current mode flags (masked): " . ($flags & GlobIterator::CURRENT_MODE_MASK) . "\n";
53            echo "Expected mode flags: " . GlobIterator::CURRENT_AS_FILEINFO . "\n";
54        }
55    } catch (UnexpectedValueException $e) {
56        // Handle potential errors, e.g., invalid glob pattern.
57        echo "An error occurred with GlobIterator: " . $e->getMessage() . "\n";
58    } finally {
59        // 7. Clean up the temporary file.
60        if (file_exists($tempFileName)) {
61            unlink($tempFileName);
62            echo "\nCleaned up temporary file: " . $tempFileName . "\n";
63        }
64    }
65}
66
67// Execute the demonstration function.
68demonstrateGlobIteratorAndTimestamps();

GlobIterator::CURRENT_MODE_MASKは、PHPのGlobIteratorが返す要素の形式(例: ファイルパス文字列、または詳細なファイル情報を含むSplFileInfoオブジェクト)を識別するための定数です。この定数自体に引数はなく、その値は整数型(int)で、GlobIteratorの持つ複数のフラグから、現在の要素の戻り値モードに関連する部分のみを抽出するビットマスクとして機能します。

このサンプルコードは、GlobIteratorを使用してファイルを検索し、そのファイルの最終更新タイムスタンプを表示する方法を示しています。特に、GlobIteratorSplFileInfoオブジェクトを返すように設定されているかを確認するためにCURRENT_MODE_MASKを使用しています。まず一時ファイルを作成し、GlobIterator::CURRENT_AS_FILEINFOフラグを指定してGlobIteratorを初期化します。これにより、イテレータはファイルの情報を含むSplFileInfoオブジェクトを返します。

その後、GlobIterator::getFlags()で現在の設定フラグを取得し、CURRENT_MODE_MASKとビット論理AND演算を行うことで、返り値のモードが期待通りCURRENT_AS_FILEINFOになっているかを検証しています。この確認が成功した場合、イテレータが返すSplFileInfoオブジェクトからgetMTime()メソッドを使ってファイルの更新タイムスタンプ(UNIXタイムスタンプ)を取得し、それを人間が読める形式の日付時刻に変換して表示しています。これにより、GlobIteratorで取得したファイル情報から「現在のタイムスタンプ」に相当する更新時刻を正確に確認できることを実演しています。

このコードは、ファイルシステムの要素を反復処理するGlobIteratorが、どのような形式のデータを返すかを確認する際にGlobIterator::CURRENT_MODE_MASKが役立つことを示しています。この定数はモードを「設定」するものではなく、現在のモード設定を「判別」するためのマスクとして利用されます。ファイル更新日時(タイムスタンプ)はUNIX時間で取得されるため、DateTimeImmutableなどを使って人間が読める形式に変換する処理が必須です。また、GlobIteratorの初期化時に適切なフラグ(例: CURRENT_AS_FILEINFO)を設定しないと、SplFileInfoオブジェクトからファイル情報を取得できない点に注意が必要です。一時ファイルの作成と削除といったリソース管理も確実に行いましょう。

関連コンテンツ

関連IT用語

関連プログラミング言語