jerowork / file-class-reflector
根据目录和文件路径获取完全限定的类名。
0.3.0
2023-02-23 19:07 UTC
Requires
- php: ^8.1
- nikic/php-parser: ^4.15
Requires (Dev)
- ergebnis/composer-normalize: ^2.15
- friendsofphp/php-cs-fixer: ^3.0
- mockery/mockery: ^1.4
- phpro/grumphp-shim: ^1.4
- phpstan/phpstan: ^1.8
- phpunit/phpunit: ^9.5 || ^10.0
- scrutinizer/ocular: ^1.8
README
根据目录和文件路径获取完全限定的类名。
安装
通过 Composer 进行安装
composer require jerowork/file-class-reflector
用法
ClassReflector
利用 nikic/php-parser 包从文件中检索完全限定的类名。
基本用法
use Jerowork\FileClassReflector\NikicParser\NikicParserClassReflectorFactory; // Create a new ClassReflector instance directly via a static factory method $reflector = NikicParserClassReflectorFactory::createInstance(); // Add necessary directories and/or files and reflect $reflector ->addDirectory(__DIR__ . '/some/directory') ->reflect(); // Get all \ReflectionClass found in files $classes = $reflector->getClasses();
ClassReflectorFactory
也可以通过构造函数实例化。这样,工厂可以被添加到依赖注入容器中。
use Jerowork\FileClassReflector\FileFinder\RegexIterator\RegexIteratorFileFinder; use Jerowork\FileClassReflector\NikicParser\NikicParserClassReflectorFactory; use PhpParser\NodeTraverser; use PhpParser\ParserFactory; // Create the factory $factory = new NikicParserClassReflectorFactory( new RegexIteratorFileFinder(), (new ParserFactory())->create(ParserFactory::PREFER_PHP7), new NodeTraverser(), ); // Create a new ClassReflector instance $reflector = $factory->create(); // ...
依赖注入服务定义
作为良好实践,我们应该始终“面向接口编程,而非具体实现”,你应该将其添加到你的依赖注入容器中。
PSR-11 容器示例
use Jerowork\FileClassReflector\ClassReflectorFactory; use Jerowork\FileClassReflector\FileFinder\FileFinder; use Jerowork\FileClassReflector\FileFinder\RegexIterator\RegexIteratorFileFinder; use Jerowork\FileClassReflector\NikicParser\NikicParserClassReflectorFactory; use PhpParser\NodeTraverser; use PhpParser\ParserFactory; use Psr\Container\ContainerInterface; return [ ClassReflectorFactory::class => static function (ContainerInterface $container): ClassReflectorFactory { return new NikicParserClassReflectorFactory( new RegexIteratorFileFinder(), (new ParserFactory())->create(ParserFactory::PREFER_PHP7), new NodeTraverser(), ); }, FileFinder::class => static fn (): FileFinder => new RegexIteratorFileFinder(), ];
Symfony YAML 文件示例
services: _defaults: autowire: true autoconfigure: true Jerowork\FileClassReflector\ClassReflectorFactory: class: Jerowork\FileClassReflector\NikicParser\NikicParserClassReflectorFactory Jerowork\FileClassReflector\FileFinder\FileFinder: class: Jerowork\FileClassReflector\FileFinder\RegexIterator\RegexIteratorFileFinder PhpParser\ParserFactory: ~ PhpParser\Parser: factory: ['@PhpParser\ParserFactory', 'create'] arguments: [1] # 1 = ParserFactory::PREFER_PHP7 PhpParser\NodeTraverser: ~