hackpack/hack-class-scanner

此包已被弃用且不再维护。作者建议使用 fredemmott/definition-finder 包。

递归扫描目录以查找 hack 类和/或接口

2.0.1 2015-08-03 23:42 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:44:55 UTC


README

Build Status HHVM Status

一个递归扫描目录以查找 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 Emmottfredemmott/definitions-finder中编写的。