reflection icon indicating copy to clipboard operation
reflection copied to clipboard

Typhoon Reflection (readonly subsplit of monorepo)

Typhoon Reflection

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

  • Native reflection adapters
  • Reflecting Types
  • Reflecting PHPDoc properties and methods
  • Implementing custom types
  • Caching

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