TypeResolver, 基于 PSR 5的类名称类型和结构元素名称解析程序

分享于 

9分钟阅读

GitHub

  繁體 雙語
A PSR-5 based resolver of Class names, Types and Structural Element Names
  • 源代码名称:TypeResolver
  • 源代码网址:http://www.github.com/phpDocumentor/TypeResolver
  • TypeResolver源代码文档
  • TypeResolver源代码下载
  • Git URL:
    git://www.github.com/phpDocumentor/TypeResolver.git
    Git Clone代码到本地:
    git clone http://www.github.com/phpDocumentor/TypeResolver
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/phpDocumentor/TypeResolver
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    License: MITTravis StatusAppveyor StatusCoveralls CoverageScrutinizer Code CoverageScrutinizer Code QualityStable VersionUnstable Version

    TypeResolver和 FqsenResolver

    关于类型为DocBlocks的类型描述了各种关键字和特殊构造,但是还说明了如何将类的部分名称静态解析为完全限定类名。

    PSR-5还引入了描述比类。接口和特性更深层的方法,称为完全限定结构元素名称( FQSEN )。 使用这种方法可以引用方法。属性和类常量,也可以引用函数和全局常量。

    这里软件包提供了两个能够

    • 对给定表达式返回一系列值对象,而解析任何分部类名称,则
    • 在解析任何部分结构元素名称到完全限定的结构元素名称后返回FQSEN对象。

    安装

    安装此库的简单方法是使用 Composer,使用以下命令:

    
    $ composer require phpdocumentor/type-resolver
    
    
    
    

    示例

    准备进入,不希望阅读下面的所有文本? 查看示例文件夹并检查你希望完成的操作类型。

    类型和元素名称

    这里组件可以采用以下两种方式之一

    • 解析类型或者类型
    • 解析完全限定结构元素名称的步骤

    这两者之间的最大区别在于它能解决的事情的数量。

    TypeResolver可以解析:

    • php基元或者伪基元,如字符串或者 void ( @var string 或者 @return void )。

    • 一个组合,如字符串( @var string[] )的array。

    • 一种化合物,如字符串或者整数( @var string|integer )。

    • array 表达式( @var (string|TypeResolver)[] )

    • 对象或者接口,如TypeResolver类( @var TypeResolver 或者 @var phpDocumentorReflectionTypeResolver )

      注意,如果要传递额外步骤的分部类名称,请参见本章 Resolving partial classes and FQSENs 以获取更多信息。

    FqsenResolver可以解析的位置:

    • 常量表达式( 例如。@see MyNamespaceMY_CONSTANT )
    • 函数表达式( 例如。@see MyNamespacemyFunction() )
    • 类表达式( 例如。@see MyNamespaceMyClass )
    • 接口表达式( 例如。@see MyNamespaceMyInterface )
    • Trait表达式( 例如。@see MyNamespaceMyTrait )
    • 类常量表达式( 例如。 @see MyNamespaceMyClass::MY_CONSTANT )
    • 属性表达式( 例如。 @see MyNamespaceMyClass::$myProperty )
    • 方法表达式( 例如。 @see MyNamespaceMyClass::myMethod() )

    解析类型

    为了解析一个类型,你必须实例化类 phpDocumentorReflectionTypeResolver 然后调用它的resolve 方法,如下所示:

    $typeResolver=newphpDocumentorReflectionTypeResolver();$type=$typeResolver->resolve('string|integer');

    在本例中,你将收到一个类的值对象 phpDocumentorReflectionTypesCompound 有两个元素,类型之一 phpDocumentorReflectionTypesString_ 还有一种类型 phpDocumentorReflectionTypesInteger

    这个解析器的真正能力在于它能够将部分类名扩展为完全限定类名;但是为了做到这一点,我们需要额外的类名。 phpDocumentorReflectionTypesContext 类,该类将通知解析程序给定表达式发生的命名空间,以及( 导入或者导入) 应用的命名空间别名。

    解析 FQSEN

    完全限定结构元素名称是对代码基中另一个元素的引用,可以使用 phpDocumentorReflectionFqsenResolver 类'resolve 方法,如下所示:

    $fqsenResolver=newphpDocumentorReflectionFqsenResolver();$fqsen=$fqsenResolver->resolve('phpDocumentorReflectionFqsenResolver::resolve()');

    在本例中,我们解析一个完全限定的结构元素名(。表示它包含完整的命名空间,类名和元素名称) 并接收 phpDocumentorReflectionFqsen 类型的值对象。

    解析器的真正功能是能够将部分元素名扩展到完全限定的结构元素名称; phpDocumentorReflectionTypesContext 类,该类将通知解析程序给定表达式发生的命名空间,以及( 导入或者导入) 应用的命名空间别名。

    解析分部类和结构元素名称

    也许这个库的最佳特性是它知道如何将分部类名称解析为完全限定的类名称。

    例如你有这个 file:

    namespaceMyExample;usephpDocumentorReflectionTypes;classClassy{/** * @var TypesContext * @see Classy::otherFunction()*/publicfunction__construct($context) {}publicfunctionotherFunction(){}}

    假设你希望解析标签中的类型和 @see 标签中的元素名。

    为了让解析器知道如何展开部分名称,你必须通过实例化名为named的新类来为它们提供一点上下文 phpDocumentorReflectionTypesContext 名称空间和正在播放的别名的名称。

    创建上下文

    你可以通过手动创建这样的上下文来实现这里目的:

    $context=newphpDocumentorReflectionTypesContext('MyExample',  [ 'Types'=>'phpDocumentorReflectionTypes']);

    或者通过使用 phpDocumentorReflectionTypesContextFactory 基于反射器对象或者提供要提取的命名空间和给定类型表达式的源代码来实例化新上下文。

    $contextFactory=newphpDocumentorReflectionTypesContextFactory();$context=$contextFactory->createFromReflector(newReflectionMethod('MyExampleClassy', '__construct'));

    或者

    $contextFactory=newphpDocumentorReflectionTypesContextFactory();$context=$contextFactory->createForNamespace('MyExample', file_get_contents('My/Example/Classy.php'));

    使用上下文

    在获得上下文之后,将它的与解析器类的resolve 方法一起传递是一个问题。

    要在上面的示例中为 @var 标记获取解析的类名,你可以执行以下操作:

    $typeResolver=newphpDocumentorReflectionTypeResolver();$type=$typeResolver->resolve('TypesContext', $context);

    当你这样做你将收到一个类的对象 phpDocumentorReflectionTypesObject_ 对于可以调用 getFqsen 方法以接收表示完整FQSEN的值对象的方法。 那就是 phpDocumentorReflectionTypesContext

    为什么FQSEN封装在另一个对象 Object_ 中?

    TypeResolver的解析方法只返回接口 Type的对象,FQSEN是一种不代表类型的公共类型。 另外:在某些情况下,类型可以表示"非类型化对象",表示它是对象( 由 object 关键字表示),但不引用使用FQSEN的特定元素。

    另一个示例是如何解析方法的FQSEN,如上面的示例中的@see 标记所示。 要解决这里问题,请执行以下操作:

    $fqsenResolver=newphpDocumentorReflectionFqsenResolver();$type=$fqsenResolver->resolve('Classy::otherFunction()', $context);

    因为Classy是当前命名空间中的类,它的FQSEN将拥有 MyExample 命名空间并通过调用你将接收到的对象的FQSEN解析器的resolve 方法来获取它。


    BASE  str    type  Struct  类型  
    相关文章