はじめに
ローカルのディレクトリ構造をPHPから直接確認できるのが、SPLに含まれる DirectoryIteratorクラス。foreach と組み合わせるだけで、opendir() や readdir() を使わずにスマートにディレクトリを走査できます。今回は「. や .. が出力されるのは正しいの?」という疑問を解消しながら、出力の仕組みをわかりやすく解説します。
目次
🗂 実行イメージ(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の仕組み
各ループで $v は DirectoryIterator オブジェクトになります。
このオブジェクトを文字列に変換(echo "{$v}")すると、内部的に __toString() が呼ばれ、ファイル名が返されます。
同じことを明示的に書くなら:
echo $v->getFilename(), "\n";と同じ意味です。
💡 よく使うメソッド一覧
| メソッド名 | 機能 |
|---|---|
$v->getFilename() | ファイル名を取得 |
$v->getPathname() | フルパスを取得 |
$v->isFile() | ファイルなら true |
$v->isDir() | ディレクトリなら true |
$v->getSize() | ファイルサイズを取得 |
✅ まとめ
| 項目 | 内容 |
|---|---|
| 使用クラス | DirectoryIterator |
| 主な目的 | ディレクトリの中身を簡潔に列挙する |
| 特徴 | foreach で直接走査できる |
出力に . と .. が含まれるか | 含まれる(正常動作) |
| 出力順 | 環境依存(正誤に影響なし) |
| 解答 | ✅ 正しい |
