serenata/name-qualification-utilities

提供处理PHP名称资格的实用程序,例如解析和本地化名称。

0.6.0 2020-10-25 20:45 UTC

This package is auto-updated.

Last update: 2024-09-26 04:09:11 UTC


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;

NamespaceNameResolverStructureAwareNameResolver之间的区别是什么?

某些常量和函数名称可能具有歧义,例如

<?php

namespace A;

$a = SOME_CONSTANT;

SOME_CONSTANT可以指代\A\SOME_CONSTANT\SOME_CONSTANT,PHP将在运行时确定使用哪一个

  1. 如果存在,解析为\A\SOME_CONSTANT
  2. 如果存在,解析为\SOME_CONSTANT
  3. 再次解析为\A\SOME_CONSTANT并失败,因为没有一个存在

NamespaceNameResolver不知道如何处理这种情况,将抛出异常,表明名称是歧义的。

StructureAwareNameResolver将请求附加信息 - 您必须将其注入提供程序 - 以确定哪些结构实际上存在,从而成功解析名称。

GPLv3 Logo