# Reflection Module The Reflection module provides a powerful, efficient, and developer-friendly API for PHP reflection operations. It enhances PHP's native reflection capabilities with caching, lazy loading, batch operations, and a fluent interface. ## Features - **Caching**: Dramatically improves performance for repeated reflection operations - **Lazy Loading**: Only loads reflection data when needed, reducing memory usage - **Batch Operations**: Efficiently process multiple classes or methods at once - **Fluent API**: Intuitive builder pattern for reflection operations - **Interface Segregation**: Focused interfaces for specific reflection needs - **PHP 8.x Support**: Full support for attributes (PHP 8.0+) and enums (PHP 8.1+) - **Memory Optimization**: Advanced memory management to prevent leaks and reduce footprint ## Basic Usage ```php use App\Framework\Core\ValueObjects\ClassName; use App\Framework\Reflection\CachedReflectionProvider; // Create a reflection provider $reflection = new CachedReflectionProvider(); // Get information about a class $class = $reflection->getClass(ClassName::create(MyClass::class)); // Check if a class has an attribute $hasAttribute = $reflection->hasAttribute( ClassName::create(MyClass::class), MyAttribute::class ); // Get method parameters $parameters = $reflection->getMethodParameters( ClassName::create(MyClass::class), 'myMethod' ); // Create a new instance if ($reflection->isInstantiable(ClassName::create(MyClass::class))) { $instance = $class->newInstance('arg1', 'arg2'); } ``` ## Advanced Usage ### Fluent API with ReflectionBuilder ```php use App\Framework\Reflection\Builder\ReflectionBuilderFactory; // Get information about a class $class = ReflectionBuilderFactory::forClass(MyClass::class) ->getClass(); // Get information about a method $method = ReflectionBuilderFactory::forMethod(MyClass::class, 'myMethod') ->getMethod(); // Check if a class has a specific attribute $hasAttribute = ReflectionBuilderFactory::forClassWithAttribute( MyClass::class, MyAttribute::class )->hasAttribute(); // Create a new instance $instance = ReflectionBuilderFactory::forClass(MyClass::class) ->newInstance('arg1', 'arg2'); ``` ### Batch Operations ```php use App\Framework\Reflection\BatchOperations\ReflectionBatchProcessor; use App\Framework\Reflection\CachedReflectionProvider; // Create a batch processor $provider = new CachedReflectionProvider(); $batchProcessor = new ReflectionBatchProcessor($provider); // Get attributes for multiple classes $attributes = $batchProcessor->getAttributesForClasses([ MyClass1::class, MyClass2::class, MyClass3::class ], RouteAttribute::class); // Get methods with a specific attribute $methods = $batchProcessor->getMethodsWithAttribute([ Controller1::class, Controller2::class, Controller3::class ], RouteAttribute::class); ``` ### Working with Enums ```php use App\Framework\Core\ValueObjects\ClassName; use App\Framework\Reflection\CachedReflectionProvider; $reflection = new CachedReflectionProvider(); $enumClass = ClassName::create(StatusEnum::class); // Check if a class is an enum if ($reflection->isEnum($enumClass)) { // Get all enum cases $cases = $reflection->getEnumCases($enumClass); // Check if enum has a specific case if ($reflection->hasEnumCase($enumClass, 'ACTIVE')) { // Get the enum case $case = $reflection->getEnumCase($enumClass, 'ACTIVE'); } // Check if enum is backed if ($reflection->isBackedEnum($enumClass)) { // Get backing type $type = $reflection->getEnumBackingType($enumClass); // Get backing value for a case $value = $reflection->getEnumCaseBackingValue($enumClass, 'ACTIVE'); } } ``` ### Specialized Interfaces The module provides specialized interfaces for specific reflection needs: ```php use App\Framework\Reflection\Contracts\ClassReflector; use App\Framework\Reflection\Contracts\MethodReflector; use App\Framework\Reflection\Contracts\AttributeReflector; use App\Framework\Reflection\CachedReflectionProvider; class MyService { public function __construct( // Only depend on what you need private ClassReflector $classReflector, private MethodReflector $methodReflector, private AttributeReflector $attributeReflector ) {} // Or use the complete implementation for all capabilities public function withComplete(CachedReflectionProvider $reflection) { // ... } } ``` ## Performance Considerations The Reflection module is optimized for performance, but reflection operations can still be expensive. Consider these best practices: - **Cache Warming**: Pre-warm the cache for frequently used classes - **Lazy Loading**: Use lazy loading for classes that might not be needed - **Batch Operations**: Use batch operations for processing multiple classes - **Memory Management**: Call `flush()` to clear the cache when done with a large batch - **Environment Configuration**: Use development mode during development for better debugging See [EVALUATION.md](EVALUATION.md) for detailed performance analysis and recommendations. ## When to Use The Reflection module is ideal for: - Framework-level features that need to analyze many classes - Applications that need efficient, repeated reflection operations - Code that benefits from a more developer-friendly reflection API - Projects that need advanced features like batch operations or lazy loading For simpler use cases, consider using PHP's native reflection API directly. ## Module Structure - **Core Components**: - `ReflectionProvider`: Main interface combining all reflection capabilities - `CachedReflectionProvider`: Complete implementation with caching - **Specialized Interfaces**: - `ClassReflector`: Class-level reflection operations - `MethodReflector`: Method-level reflection operations - `PropertyReflector`: Property-level reflection operations - `ParameterReflector`: Parameter-level reflection operations - `AttributeReflector`: Attribute-related reflection operations - `EnumReflector`: Enum-related reflection operations (PHP 8.1+) - `InstantiationReflector`: Instantiation-related reflection operations - `CacheManager`: Cache management operations - **Performance Optimizations**: - `LazyReflectionProxy`: Lazy-loading proxy for ReflectionClass - `ReflectionBatchProcessor`: Batch operations for multiple classes - `ReflectionBuilder`: Fluent API for reflection operations - `ReflectionCache`: Coordinated caching for reflection data ## Further Documentation - [EVALUATION.md](EVALUATION.md): Detailed analysis of the module's value and overhead - [Builder/README.md](Builder/README.md): Documentation for the ReflectionBuilder - [BatchOperations/README.md](BatchOperations/README.md): Documentation for batch operations