phpactor/worse-reflection

一个比更好反射器还差的懒AST反射器

0.6.0 2024-08-09 07:17 UTC

README

此软件包在此处未积极开发,而是在主要的 phpactor 仓库中开发。它偶尔会更新。有关此存储库的任何问题请在此处提出。

此库旨在提供一个轻量级的基于类的AST "反射"库。

不如更好

它受到 BetterReflection 的影响,以下是一些不同之处

  • 可以反射变量。
  • 不旨在实现内置PHP反射API。
  • 使用惊人的 Tolerant Parser
  • 使用PHPStorm存根提供内部类的反射。

它正在开发中,以提供对 Phpactor 内省和重构工具的支持。因此,它由该用例驱动。

如果您需要全面的反射,请使用BetterReflection。如果您需要更快的反射,包括无支持的类型/值流,并且频繁的BC中断,则可以使用此软件包(请注意,我有一段时间没有基准测试BR了,它现在可能更快)。

用法

$reflector = ReflectorBuilder::create()
    ->addSource('<?php ...')
    ->build();

$class = $reflector->reflectClass('Foobar');

$class->methods()->get('foobar')->visiblity()    == Visibility::public();
$class->properties()->get('barbar')->visiblity() == Visibility::public();

/** @var ReflectionMethod */
foreach ($class->methods() as $method) {
    echo $method->name();                                  // methodName
    echo $method->returnType()->short();                   // Foobar
    echo (string) $method->returnType();                   // This\Is\Foobar
    echo (string) $method->inferredReturnTypes()->best(); // from docblock if it exists

    foreach ($method->parameters() as $parameter) {
        $parameter->name();                      // paramName
        (string) $parameter->inferredType();     // Fully\Qualified\ParamType
    }

}

foreach ($class->traits() as $trait) {
    // ...
}

foreach ($class->interfaes() as $interface) {
    // ...
}

foreach ($class->method('foobar')->frame()->locals() as $variable) {
    $variable->offset()->toInt(); // byte offset
    $variable->type();            // variable type (if available )
    $variable->value();           // variable value (if available)
}

$offset = $reflection->reflectOffset(
    SourceCode::fromString('...'), 
    Offset::fromInt(1234)
);

$offset->value()->type();    // type at offset (if available)
$offset->value()->value();   // value (e.g. 1234)
$offset->frame();            // return frame

查看测试以获取更多示例...

贡献

此软件包是开源的,欢迎贡献!请随意在此存储库上打开一个拉取请求。

支持

  • 在主要的 Phpactor 仓库中创建一个问题。
  • 加入Slack上的 #phpactor 频道 Symfony Devs