php-integrator / name-qualification-utilities
0.6.0
2020-10-25 20:45 UTC
Requires
- php: >=7.1.0
- ext-mbstring: *
- serenata/common: ^0.3
Requires (Dev)
- phpspec/phpspec: ^4.3
- symfony/var-dumper: ^4.0
README
提供与PHP名称资格相关的各种实用工具
- 确定文件中特定位置的活动命名空间和导入
- 根据use语句和命名空间将名称解析为其完全限定名称
- 根据use语句和命名空间将完全限定名称本地化为本地名称
此项目属于Serenata项目。
安装
composer require "serenata/name-qualification-utilities"
用法
<?php
use Serenata\Common\Position;
use Serenata\Common\FilePosition;
use Serenata\NameQualificationUtilities;
// NOTE: Implement a suitable provider in your code.
$fileNamespaceProvider = new class implements NameQualificationUtilities\FileNamespaceProviderInterface {
public function provide(string $file): array
{
return $arrayOfNamespaceObjectsWithImportsAttached;
}
};
$positionalNamespaceDeterminer = new NameQualificationUtilities\PositionalNamespaceDeterminer($fileNamespaceProvider);
$factory = new NameQualificationUtilities\PositionalNameResolverFactory($positionalNamespaceDeterminer);
// Create a name resolver that can resolve names using the imports and namespace that apply at the specified position.
$position = new Position($someLineNumber, $someCharacterIndexOnLine);
$filePosition = new FilePosition('MyPhpFile.php', $position);
$nameResolver = $factory->create($filePosition);
$result = $nameResolver->resolve('A', NameQualificationUtilities\NameKind::CLASSLIKE);
// $result will now contain the FQCN of the class, e.g. '\A', '\SomeNamespace\A', ...
不是PHP解析器
没有提供代码的实际解析以查找可用的导入和命名空间,但您可以为此使用像php-parser这样的工具。相反,必须通过实现接口FileNamespaceProviderInterface
来由本库的用户提供可用的导入和命名空间。
"kind"参数是什么意思?
这是必要的,因为PHP支持具有不同"kind"的相同名称的use语句或导入。换句话说,您可以导入与类相同名称的常量
<?php
use A\B;
use function A\B;
use const A\B;
NamespaceNameResolver
和StructureAwareNameResolver
之间的区别是什么?
一些常量和函数名称可能是模糊的,例如
<?php
namespace A;
$a = SOME_CONSTANT;
SOME_CONSTANT
可以指代\A\SOME_CONSTANT
或\SOME_CONSTANT
,PHP在运行时确定使用哪一个
- 如果存在,解析为
\A\SOME_CONSTANT
- 如果存在,解析为
\SOME_CONSTANT
- 再次解析为
\A\SOME_CONSTANT
并失败,因为都不存在
NamespaceNameResolver
不知道如何处理这种情况,并将抛出一个异常,指出名称是模糊的。
StructureAwareNameResolver
将请求额外的信息 - 从您必须注入其内的提供者处获取 - 以确定哪些结构实际上存在,从而成功解析名称。