phpactor / worse-reflection
Lazy AST reflector that is much worse than better
Installs: 103 503
Dependents: 11
Suggesters: 0
Security: 0
Stars: 20
Watchers: 6
Forks: 9
Open Issues: 5
Requires
- php: ^8.1
- amphp/amp: ^2.6
- jetbrains/phpstorm-stubs: *
- phpactor/docblock-parser: ^0.2.0
- phpactor/text-document: ^2.1.0
- phpactor/tolerant-php-parser: dev-main
- psr/log: ^1.0||^2.0||^3.0
Requires (Dev)
- ergebnis/composer-normalize: ^2.0
- friendsofphp/php-cs-fixer: ^3.0
- phpactor/class-to-file: ~0.5.0
- phpactor/test-utils: ^1.1.5
- phpbench/phpbench: dev-master
- phpspec/prophecy-phpunit: ^2.0
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^9.0
- symfony/filesystem: ^6.0
- symfony/var-dumper: ^5.2
- 0.6.0
- dev-master / 0.5.x-dev
- 0.5.4
- 0.5.3
- 0.5.2
- 0.5.1
- 0.5.0
- 0.4.10
- 0.4.9
- 0.4.8
- 0.4.7
- 0.4.6
- 0.4.5
- 0.4.4
- 0.4.3
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.1
- 0.3.0
- 0.2.0
- 0.1.0
- dev-new-docblock-parser
- dev-new-types-type-factory
- dev-enum
- dev-cache-exceptions
- dev-analyze
- dev-list-foreach
- dev-mixins
- dev-null-ast-node
- dev-ci-phpbench
- dev-virtual-method-declaration
- dev-foobar
- dev-maestro
- dev-anonymous_class_fix
- dev-refactoring
- dev-resolver_extraction
- dev-validate_class_name
- dev-parameter_inferred_type
- dev-phpstan_docblock
- dev-performance_fixes
- dev-typeobject
- dev-docblock
- dev-frame_tree
- dev-phpbench_reports
- dev-namespace_reflection
- dev-accept_sourcecode_as_argument
- dev-scf-filesystem
- dev-property_type
- dev-node_reflector
- dev-explicit_reflector_methods
- dev-more_symbols
- dev-phpbench
- dev-traits
- dev-node_resolve_unknown_classes
- dev-service_locator
- dev-stub_locator
- dev-constants
- dev-class_interface_parents
- dev-hotfixes
This package is auto-updated.
Last update: 2024-12-09 08:11:47 UTC
README
This package is not actively developed here but in the main phpactor repository. It is occasionally updated. Raise any issues about this repository there.
This library aims to provide a light class-based AST based "reflection" library.
Worse than Better
It is influenced by BetterReflection, diffrerences are as follows:
- Can reflect variables.
- Does not aim to implement built-in PHP reflection API.
- Uses the amazing Tolerant Parser.
- Uses the PHPStorm stubs to provide reflections of internal classes.
It is being developed to provide support for the Phpactor introspection and refactoring tool. And is therefore driven by that use case.
If you want comprehsnsive reflection, use BetterReflection. If you want faster reflection including type/value flow with no support and frequent BC breaks, then you can use this one (note that I havn't benchmarked BR in sometime, it may well be faster now).
Usage
$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
See tests for more examples...
Contributing
This package is open source and welcomes contributions! Feel free to open a pull request on this repository.
Support
- Create an issue on the main Phpactor repository.
- Join the
#phpactor
channel on the Slack Symfony Devs channel.