serenata / name-qualification-utilities
提供处理PHP名称资格的实用程序,例如解析和本地化名称。
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
将请求附加信息 - 您必须将其注入提供程序 - 以确定哪些结构实际上存在,从而成功解析名称。