You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 8中如何获取带有指定Attribute的所有类?

获取所有带有特定Attribute的PHP类的方法

解决思路

  • 遍历项目中的所有PHP文件,定位文件内定义的类
  • 通过PHP反射机制(ReflectionClass)检查每个类是否标注了目标Attribute
  • 收集所有符合条件的类名

具体实现代码

核心扫描函数

function findClassesWithAttribute(string $attributeName, string $directory): array
{
    $classes = [];
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
    
    foreach ($iterator as $file) {
        if ($file->getExtension() !== 'php') {
            continue;
        }
        
        $namespace = '';
        $content = file_get_contents($file->getPathname());
        $tokens = token_get_all($content);
        
        foreach ($tokens as $key => $token) {
            // 提取命名空间
            if ($token[0] === T_NAMESPACE) {
                $namespace = '';
                for ($i = $key + 1; $i < count($tokens); $i++) {
                    if ($tokens[$i][0] === T_STRING || $tokens[$i][0] === T_NS_SEPARATOR) {
                        $namespace .= $tokens[$i][1];
                    } elseif ($tokens[$i] === ';' || $tokens[$i][0] === T_CURLY_OPEN) {
                        break;
                    }
                }
                $namespace .= '\\';
            }
            
            // 定位类定义
            if ($token[0] === T_CLASS && $tokens[$key + 1][0] === T_WHITESPACE && $tokens[$key + 2][0] === T_STRING) {
                $className = $namespace . $tokens[$key + 2][1];
                try {
                    $reflection = new ReflectionClass($className);
                    // 检查是否存在目标Attribute
                    if ($reflection->getAttributes($attributeName)) {
                        $classes[] = $className;
                    }
                } catch (ReflectionException) {
                    // 类无法加载,直接跳过
                    continue;
                }
            }
        }
    }
    
    return $classes;
}

使用示例

// 替换为你的目标Attribute类名
$targetAttribute = MyAttribute::class;
// 替换为需要扫描的项目根目录
$scanDir = __DIR__;

$matchedClasses = findClassesWithAttribute($targetAttribute, $scanDir);

// 输出结果
print_r($matchedClasses);

注意事项

  • 确保项目的自动加载机制正常(比如Composer的autoload),否则ReflectionClass可能无法找到对应类,导致扫描遗漏。
  • 可以在遍历目录时添加过滤逻辑,跳过vendor、node_modules等无关目录,提升扫描效率。
  • 大型项目建议缓存扫描结果,比如将符合条件的类列表写入缓存文件,避免每次都全量扫描。

内容的提问来源于stack exchange,提问作者Dmitry Leiko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:25:06