typhoon/reflection

Static PHP reflection with phpDoc support

0.4.4 2024-08-18 19:56 UTC

This package is auto-updated.

Last update: 2024-12-21 15:19:05 UTC


README

PHP Version Requirement GitHub Release Psalm Level Psalm Type Coverage Code Coverage Mutation testing badge

Typhoon Reflection is an alternative to native PHP Reflection. It is:

  • static (does not run or autoload reflected code),
  • fast (due to lazy loading and caching),
  • fully compatible with native reflection,
  • supports most of the Psalm and PHPStan phpDoc types,
  • can resolve templates,
  • does not leak memory and can be safely used with zend.enable_gc=0.

Installation

composer require typhoon/reflection typhoon/phpstorm-reflection-stubs

typhoon/phpstorm-reflection-stubs is a bridge for jetbrains/phpstorm-stubs. Without this package internal classes and functions are reflected from native reflection without templates.

Basic Usage

use Typhoon\Reflection\TyphoonReflector;
use Typhoon\Type\types;
use function Typhoon\Type\stringify;

/**
 * @template TTag of non-empty-string
 */
final readonly class Article
{
    /**
     * @param list<TTag> $tags
     */
    public function __construct(
        private array $tags,
    ) {}
}

$reflector = TyphoonReflector::build();
$class = $reflector->reflectClass(Article::class);
$tagsType = $class->properties()['tags']->type();

var_dump(stringify($tagsType)); // "list<TTag#Article>"

$templateResolver = $class->createTemplateResolver([
    types::union(
        types::string('PHP'),
        types::string('Architecture'),
    ),
]);

var_dump(stringify($tagsType->accept($templateResolver))); // "list<'PHP'|'Architecture'>"

Documentation

Documentation is still far from being complete. Don't hesitate to create issues to clarify how things work.