DirectoryIteratorを、「ディレクトリ内のアイテムをリストアップしてくれるオブジェクト」だと思ってたら痛い目にあいました。
闇その1:別の変数に代入すると空になる
$dir = new DirectoryIterator('/usr/');
$items = [];
foreach ($dir as $item) {
$items[] = $item;
}
var_dump($items[0]);
実行結果
object(DirectoryIterator)#1 (3) {
["pathName":"SplFileInfo":private]=>
string(0) ""
["glob":"DirectoryIterator":private]=>
bool(false)
["subPathName":"RecursiveDirectoryIterator":private]=>
string(0) ""
}
闇その2:ディレクトリとディレクトリエントリの実体が同じである。
$dir = new DirectoryIterator('/usr/');
foreach ($dir as $item) {
var_dump($dir === $item);
}
実行結果
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
教訓
DirectoryIteratorを「リスト」だと思ってはいけない。
どなたか、なぜこういう挙動になるのか教えていただると幸いです。