xp-forge/mirrors

此包已废弃,不再维护。作者建议使用xp-framework/reflection包。

镜像

v6.0.0 2020-04-10 17:02 UTC

README

Build Status on TravisCI XP Framework Module BSD Licence Requires PHP 7.0+ Latest Stable Version

《Mirrors》库为XP框架的反射API提供替代方案。

特性

简洁流畅:此库旨在减少在处理反射时调用代码中的if语句的数量。一个例子是构造函数处理 - 如果一个类型没有声明构造函数,则返回一个默认构造函数。另一个例子是all()迭代器,它可以有条件地根据实例和静态成员进行过滤,而不是必须循环并检查修饰符。

来源:此库支持通过PHP的反射类或直接从其源代码反射类。后者可以用来防止类被加载,以及在需要反射类在类加载过程中(例如,用于编译时元编程,见partial types库)的情况。

PHP7:此库支持PHP7的标量类型提示返回类型语法,使用运行时反射和静态代码源。

子命令:此库提供了一个RFC #0303集成,并为新的XP运行器提供了一个“mirror”子命令。有关如何使用它,请参阅xp help mirror

API

入口类是类型镜像。可以通过传递类型字面量(例如util\Date)、完全限定的类名(例如util.Date)、XPClass实例或PHP的ReflectionClass来构建,并且可以提供源来加载信息。构造函数不会为不存在的类型抛出异常:相反,使用present()来检查类型是否存在。

public class lang.mirrors.TypeMirror extends lang.Object {
  public __construct(var $arg[, lang.mirrors.Sources $source])

  public bool present()
  public string name()
  public lang.Type type()
  public string comment()
  public self parent()
  public lang.mirrors.Kind kind()
  public lang.mirrors.Package package()
  public lang.mirrors.Modifiers modifiers()
  public lang.mirrors.parse.CodeUnit unit()
  public lang.mirrors.Traits traits()
  public lang.mirrors.Interfaces interfaces()
  public lang.mirrors.Constructor constructor()
  public lang.mirrors.Methods methods()
  public lang.mirrors.Method method(string $named) throws lang.ElementNotFoundException
  public lang.mirrors.Fields fields()
  public lang.mirrors.Field field(string $named) throws lang.ElementNotFoundException
  public lang.mirrors.Constants constants()
  public lang.mirrors.Annotations annotations()
  public lang.mirrors.Annotation annotation(string $named) throws lang.ElementNotFoundException
  public self resolve(string $name)
}

构造函数

为了创建类型的实例,请使用constructor()方法。无论该类型是否声明了构造函数,它都将始终返回一个构造函数实例 - 使用present()进行测试,如果需要的话。

public class lang.mirrors.Constructor extends lang.mirrors.Routine {
  public __construct(lang.mirrors.TypeMirror $mirror)

  public string name()
  public string comment()
  public [:var] tags()
  public bool present()
  public lang.mirrors.Modifiers modifiers()
  public lang.Generic newInstance([var... $args= null]) throws ...
  public lang.mirrors.Throws throws()
  public lang.mirrors.Parameters parameters()
  public lang.mirrors.Parameter parameter(string|int $arg) throws lang.ElementNotFoundException
  public lang.mirrors.TypeMirror declaredIn()
  public lang.mirrors.Annotations annotations()
  public lang.mirrors.Annotation annotation(string $named) throws lang.ElementNotFoundException
}

方法

可以通过在镜像上调用methods()来检索方法,它返回一个方法集合。它还可以用来检查方法的是否存在,通过名称获取方法,或遍历提供的方法。

public class lang.mirrors.Methods extends lang.Object implements php.IteratorAggregate {
  public __construct(lang.mirrors.TypeMirror $mirror)

  public static lang.mirrors.Predicates ofClass()
  public static lang.mirrors.Predicates ofInstance()
  public static lang.mirrors.Predicates withAnnotation(string $annotation)
  public static lang.mirrors.Predicates with(function(lang.mirrors.Member): bool $predicate)

  public bool provides(string $name)
  public lang.mirrors.Method named(string $name) throws lang.ElementNotFoundException
  public iterable all([lang.mirrors.Predicates $filter= null])
  public iterable declared([lang.mirrors.Predicates $filter= null])
  public iterable getIterator()
}

public class lang.mirrors.Method extends lang.mirrors.Routine {
  public __construct(lang.mirrors.TypeMirror $mirror, var $arg)

  public string name()
  public string comment()
  public [:var] tags()
  public lang.mirrors.Modifiers modifiers()
  public lang.Type returns()
  public var invoke([var $instance= null], [var[] $args= [ ]]) throws ...
  public lang.mirrors.Throws throws()
  public lang.mirrors.Parameters parameters()
  public lang.mirrors.Parameter parameter(string|int $arg) throws lang.ElementNotFoundException
  public lang.mirrors.TypeMirror declaredIn()
  public lang.mirrors.Annotations annotations()
  public lang.mirrors.Annotation annotation(string $named) throws lang.ElementNotFoundException
}

public class lang.mirrors.Parameters extends lang.Object implements php.IteratorAggregate {
  public __construct(lang.mirrors.Routine $mirror, var $reflect)

  public bool present()
  public int length()
  private [:var] lookup()
  public bool provides(string $name)
  public lang.mirrors.Parameter named(string $name) throws lang.ElementNotFoundException
  public lang.mirrors.Parameter first() throws lang.ElementNotFoundException
  public lang.mirrors.Parameter at(int $position) throws lang.ElementNotFoundException
  public iterable getIterator()
}

public class lang.mirrors.Parameter extends lang.Object {
  public __construct(lang.mirrors.Routine $mirror, var $reflect)

  public string name()
  public int position()
  public lang.mirrors.Routine declaringRoutine()
  public bool isOptional()
  public bool isVariadic()
  public bool isVerified()
  public lang.Type type()
  public var defaultValue() throws lang.IllegalStateException
}

字段

可以通过在镜像上调用fields()来检索字段,它返回一个字段集合。与方法类似,它提供了命名查找、迭代和存在检查。

public class lang.mirrors.Fields extends lang.Object implements php.IteratorAggregate {
  public __construct(lang.mirrors.TypeMirror $mirror)

  public static lang.mirrors.Predicates ofClass()
  public static lang.mirrors.Predicates ofInstance()
  public static lang.mirrors.Predicates withAnnotation(string $annotation)
  public static lang.mirrors.Predicates with(function(lang.mirrors.Member): bool $predicate)

  public bool provides(string $name)
  public lang.mirrors.Field named(string $name) throws lang.ElementNotFoundException
  public iterable all([lang.mirrors.Predicates $filter= null])
  public iterable declared([lang.mirrors.Predicates $filter= null])
  public iterable getIterator()
}

public class lang.mirrors.Field extends lang.mirrors.Member {
  public __construct(lang.mirrors.TypeMirror $mirror, var $arg)

  public string name()
  public string comment()
  public lang.Type type()
  public [:var] tags()
  public lang.mirrors.Modifiers modifiers()
  public var read([var $instance= null]) throws lang.IllegalArgumentException
  public void modify(var $instance, var $value) throws lang.IllegalArgumentException
  public lang.mirrors.TypeMirror declaredIn()
  public lang.mirrors.Annotations annotations()
  public lang.mirrors.Annotation annotation(string $named) throws lang.ElementNotFoundException
}

修饰符

类型、构造函数、方法和字段可以有修饰符,可以通过modifiers()访问。

public class lang.mirrors.Modifiers extends lang.Object {
  const IS_STATIC = 1
  const IS_ABSTRACT = 2
  const IS_FINAL = 4
  const IS_PUBLIC = 256
  const IS_PROTECTED = 512
  const IS_PRIVATE = 1024
  const IS_NATIVE = 61440

  public __construct(var $arg)

  public int bits()
  public string names()
  public bool isStatic()
  public bool isAbstract()
  public bool isFinal()
  public bool isPublic()
  public bool isProtected()
  public bool isPrivate()
  public bool isNative()
}

常量

PHP中的类常量是具有单独语法的静态最终字段。您可以使用constants()来检索常量实例的集合

public class lang.mirrors.Constants extends lang.Object implements php.IteratorAggregate {
  public __construct(lang.mirrors.TypeMirror $mirror)

  public bool provides(string $name)
  public lang.mirrors.Constant named(string $name) throws lang.ElementNotFoundException
  public iterable getIterator()
}

public class lang.mirrors.Constant extends lang.Object {
  public __construct(lang.mirrors.TypeMirror $mirror, string $name, var $value)

  public string name()
  public var value()
  public lang.mirrors.TypeMirror declaredIn()
}

注解

在XP框架中,类型、字段和方法都可以进行注解。任何可注解的元素都提供了一个annotations()访问器。它返回一个可用于命名查找、迭代和存在性检查的注解集合。

public class lang.mirrors.Annotations extends lang.Object implements php.IteratorAggregate {
  public __construct(lang.mirrors.TypeMirror $mirror, var $backing)

  public bool present()
  public bool provides(string $name)
  public lang.mirrors.Annotation named(string $name) throws lang.ElementNotFoundException
  public iterable getIterator()
}

public class lang.mirrors.Annotation extends lang.Object {
  public __construct(lang.mirrors.TypeMirror $mirror, var $name, var $value)

  public string name()
  public var value()
  public lang.mirrors.TypeMirror declaredIn()
}