函數原始碼
";
echo "檔案總數: $number";
改進版 (遞迴、過濾、物件導向)
isFile() && preg_match($pattern, $file->getFilename())) {
$files[] = $file->getPathname();
}
}
return $files;
}
}
$scanner = new DirScanner();
$phpFiles = $scanner->scan(__DIR__, '/\.php$/');
echo "PHP 檔案數: " . count($phpFiles);
print_r($phpFiles);
關鍵差異對照
| 特性 | 舊版 searchdir | 改進版 DirScanner |
| 遞迴子目錄 | 否 | 是 (RecursiveIteratorIterator) |
| 檔案過濾 | 無 | Regex pattern 參數 |
| 回傳方式 | 全域變數 | 直接回傳陣列 |
| 記憶體效率 | 一次載入所有 | 可改用 Generator 逐個產出 |
| 錯誤處理 | 無 | 可拋出 Exception |
Generator 版 (大量檔案低記憶體)
function scanGen(string $dir) : Generator {
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS));
foreach ($it as $file) {
if ($file->isFile()) yield $file->getPathname();
}
}
foreach (scanGen('/var/log') as $path) {
// 逐個處理,不佔用大量記憶體
echo $path . "\n";
}