7
6

More than 5 years have passed since last update.

DirectoryIteratorの闇

Last updated at Posted at 2014-03-05

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を「リスト」だと思ってはいけない。

どなたか、なぜこういう挙動になるのか教えていただると幸いです。

7
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6