php-integrator/name-qualification-utilities

此包已被废弃,不再维护。作者建议使用serenata/name-qualification-utilities包代替。

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

0.6.0 2020-10-25 20:45 UTC

This package is auto-updated.

Last update: 2020-10-25 19:45:53 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