hackpack / hack-class-scanner
Requires
- hhvm: *
- 91carriage/phpunit-hhi: ^4.5
Requires (Dev)
- phpunit/phpunit: ^4.7
This package is not auto-updated.
Last update: 2022-02-01 12:44:55 UTC
README
一个递归扫描目录以查找 Hack 定义的字类
- 类
- 接口
- 特质
- 枚举
- 类型定义
- NewType 定义
- 函数
- 常量
安装
安装 Composer 然后在项目目录中执行以下命令
composer require hackpack/hack-class-scanner
使用
要使用此类,只需使用要扫描的文件/基本目录集合和要忽略的文件/目录集合进行实例化。
use HackPack\Scanner\ClassScanner; use HackPack\Scanner\NameType; $scanner = new ClassScanner( Set{‘directory/to/scan’, ‘other/directory’, ‘file/to/scan.txt’}, Set{‘other/directory/to/ignore’, ‘other/directory/file_to_ignore.txt’} ); $classes = $scanner->getNameToFileMap(NameType::className); $interfaces = $scanner->getNameToFileMap(NameType::interfaceName); $traits = $scanner->getNameToFileMap(NameType::traitName); $enums = $scanner->getNameToFileMap(NameType::enumName); $types = $scanner->getNameToFileMap(NameType::typeName); $newtypes = $scanner->getNameToFileMap(NameType::newtypeName); $functions = $scanner->getNameToFileMap(NameType::functionName); $constants = $scanner->getNameToFileMap(NameType::constantName);
getNameToFileMap
方法接受一个参数,指定所需定义的类型。 getNameToFileMap
将返回一个 Map<string,string>
,其键是类、接口、特质等的名称,包括完整命名空间,其值是该定义所在的文件的完整路径。
请注意,默认情况下将扫描所有文件(而不仅仅是 .php 和/或 .hh 文件)。如果您只想扫描具有特定扩展名的文件,请参阅下面的文件名过滤器部分。
过滤器
您可以根据定义的名称和/或文件名来筛选结果。每个过滤器都必须是一个具有 function(string) : bool
签名的闭包。
文件名过滤器
要注册文件名过滤器,请使用过滤器回调调用 ClassScanner->addFileNameFilter()
(见以下示例)。
文件名过滤器的输入是文件的完整路径(通过 realpath
)。如果所有注册的过滤器函数对于特定文件名都返回 true
,则将扫描该文件。如果至少有一个注册的文件过滤器返回 false
,则不会读取该文件(通过 file_get_contents
)。
定义名称过滤器
要注册名称过滤器,请使用名称类型和过滤器回调调用 ClassScanner->addNameFilter()
(见以下示例)。
名称过滤器的输入是类、接口、特质等的名称,包括完整命名空间。如果至少有一个注册的过滤器函数对于特定名称返回 false
,则保证该名称不会出现在结果中。请注意,如果文件中还有其他未筛选的定义,则出现在筛选定义中的文件可能仍在列表中。如果您想确保跳过某个文件,请定义文件名过滤器。
示例过滤器
在此示例中,使用简单的正则表达式来筛选文件名和类名。
use HackPack\Scanner\ClassScanner; use HackPack\Scanner\NameType; $includes = Set{...}; $excludes = Set{...}; $scanner = new ClassScanner($includes, $excludes); // Define the filter callbacks $classFilter = $className ==> preg_match(‘/pattern/’, $className); $fileFilter = $fileName ==> preg_match(‘/pattern/’, $fileName); // Attach the filters $scanner->addDefinitionNameFilter(NameType::className, $classFilter); $scanner->addFileNameFilter($fileFilter); // Retreive the class definitions $classMap = $scanner->mapDefinitionToFile(NameType::className);
在这个例子中,我们专门寻找XHP类,基于所有XHP类都定义在.xhp
文件中的假设。
use HackPack\Scanner\ClassScanner; use HackPack\Scanner\NameType; $includes = Set{...}; $excludes = Set{...}; $scanner = new ClassScanner($includes, $excludes); // Define the filters $classFilter = $className ==> substr($className, 0, 4) === 'xhp_'; $fileFilter = $fileName ==> substr($fileName, -4) === '.xhp'; // Attach the filters $scanner->addNameFilter(NameType::className, $classFilter); $scanner->addFileNameFilter($fileFilter); // Retreive the class definitions $xhpClasses = $scanner->mapClassToFile();
感谢
文件解析算法和大多数测试都是由Fred Emmott在fredemmott/definitions-finder中编写的。