《PHP8上級試験対策》DirectoryIteratorクラスでディレクトリを一覧表示する

  • URLをコピーしました!

はじめに

ローカルのディレクトリ構造をPHPから直接確認できるのが、SPLに含まれる DirectoryIteratorクラスforeach と組み合わせるだけで、opendir()readdir() を使わずにスマートにディレクトリを走査できます。今回は「... が出力されるのは正しいの?」という疑問を解消しながら、出力の仕組みをわかりやすく解説します。

キーワード: DirectoryIterator / SPL / イテレータ / __toString / ディレクトリ走査

目次

🗂 実行イメージ(DirectoryIteratorの動き)

下の図は、DirectoryIterator(__DIR__) がどのようにディレクトリ内の要素を1件ずつ返すかを示しています。... が先に現れるのは、UNIX系ファイルシステムの仕様によるものです。 

┌─────────────────────────────────┐
│ DirectoryIterator(__DIR__)      │
│   ↓ foreach                     │
│  ├── "."   (カレントディレクトリ)   │
│  ├── ".."  (親ディレクトリ)        │
│  ├── "storage"                  │
│  ├── ".editorconfig"            │
│  ├── "database"                 │
│  └── ...(環境によって異なる)     │
└─────────────────────────────────┘

🧩 DirectoryIteratorとは?

DirectoryIterator は PHP 標準ライブラリ(SPL)のクラスで、ディレクトリの内容をオブジェクトとして扱えるイテレータ です。通常の opendir()readdir() のようにポインタ操作を行う必要がなく、foreach で簡潔にファイル一覧を取得できます。

💻 実行例コード

<?php
declare(strict_types=1);
error_reporting(-1);

foreach (new DirectoryIterator(__DIR__) as $v) {
    echo "{$v}\n";
}

出力例

.
..
storage
.editorconfig
database
bootstrap
.gitignore
tests
package.json
routes
.env

✅ 出力結果は「.(カレント)」と「..(親)」を含むのが正しい挙動です。ファイルやディレクトリの順序は、環境によって変わります。

⚙️ DirectoryIteratorの仕組み

各ループで $vDirectoryIterator オブジェクトになります。
このオブジェクトを文字列に変換(echo "{$v}")すると、内部的に __toString() が呼ばれ、ファイル名が返されます。

同じことを明示的に書くなら:

echo $v->getFilename(), "\n";

と同じ意味です。

💡 よく使うメソッド一覧

メソッド名機能
$v->getFilename()ファイル名を取得
$v->getPathname()フルパスを取得
$v->isFile()ファイルなら true
$v->isDir()ディレクトリなら true
$v->getSize()ファイルサイズを取得

✅ まとめ

項目内容
使用クラスDirectoryIterator
主な目的ディレクトリの中身を簡潔に列挙する
特徴foreach で直接走査できる
出力に ... が含まれるか含まれる(正常動作)
出力順環境依存(正誤に影響なし)
解答正しい

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次