ignoreDotFiles(true) 只排除以 . 开头的文件和目录(如 .git、.env),底层调用 RecursiveDirectoryIterator::SKIP_DOTS,性能好且无歧义;不能跳过 vendor/ 等目录,也不处理 .gitignore 规则。

直接结论:用 ignoreDotFiles(true) 排除隐藏文件,配合 contains() 搜索注释内容;但要注意 PHP 注释(如 //、/* */)是文本内容,不是语法结构,Finder 只做字符串/正则匹配,不解析 PHP 代码。
ignoreDotFiles(true) 能排除哪些文件?
它只跳过以 . 开头的文件和目录(如 .git、.env、.editorconfig),不处理其他“逻辑隐藏”场景(比如被 .gitignore 忽略但没加点的文件)。这个方法底层调用的是 RecursiveDirectoryIterator::SKIP_DOTS,属于操作系统级过滤,性能好、无歧义。
常见误用:
- 以为它能跳过 vendor/ 或 node_modules/ → 实际要用 exclude()
- 和 ignoreVCSIgnored(true) 混用 → 后者才读取 .gitignore 规则,两者机制完全不同
contains() 搜索注释内容时的三个关键限制
contains() 是纯文本扫描,对注释类内容要特别注意:
- 单行注释
// TODO: fix this→ 可直接搜contains('TODO'),但会同时命中字符串里的"// TODO" - 多行注释
/* @deprecated */→ 推荐用正则:contains('/*\s*@deprecated\s*\*/'),注意转义星号和空格 - PHPDoc 标签如
/** @var int $x */→ 单靠contains('@var')容易误匹配普通注释,建议加上下文锚点:contains('/\/\*\*\s*@var\b/')
性能提示:含正则的 contains() 会逐字节读取文件内容,大文件(>1MB)可能明显变慢;可先用 size() 做前置过滤。
组合使用时的顺序和陷阱
链式调用顺序影响结果,尤其涉及 exclude() 和 ignoreDotFiles():
- ✅ 正确顺序:
$finder->files()->ignoreDotFiles(true)->exclude(['vendor'])->contains('FIXME')->in('src/')
→ 先跳过点文件,再排除目录,最后读内容,逻辑清晰 - ❌ 错误写法:
$finder->contains('FIXME')->ignoreDotFiles(true)->in('src/')
→contains()在in()之前调用无效,Finder 不允许“先过滤后指定路径” - ⚠️ 隐藏坑:
exclude()传数组时,路径名必须和磁盘上完全一致(大小写、斜杠方向),Windows 下常见exclude(['Vendor'])失效
最易被忽略的一点:Finder 的 contains() 默认使用 PCRE 正则,但不启用 PCRE_MULTILINE,所以 ^ 和 $ 只匹配整行开头结尾,无法跨行匹配注释块 —— 如果真需要跨行,得自己用 file_get_contents() + preg_match() 补充处理。


















