はじめに
ローカルのディレクトリ構造を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 で直接走査できる |
出力に . と .. が含まれるか | 含まれる(正常動作) |
出力順 | 環境依存(正誤に影響なし) |
解答 | ✅ 正しい |