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.
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.
useTyphoon\Reflection\TyphoonReflector;
useTyphoon\Type\types;
usefunctionTyphoon\Type\stringify;
/** * @template TTag of non-empty-string */finalreadonlyclass Article
{
/** * @param list<TTag> $tags */publicfunction__construct(
privatearray$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'>"- 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.