diff --git a/fixtures/classes/Loadable/BaseClass.php b/fixtures/classes/Loadable/BaseClass.php new file mode 100644 index 0000000..e8eb346 --- /dev/null +++ b/fixtures/classes/Loadable/BaseClass.php @@ -0,0 +1,17 @@ +get_fully_loadable_class( $class ); + + if ( ! $reflection_class ) { + continue; + } // Using reflection, check if the class can be initialized. // If not, skip. @@ -174,6 +176,26 @@ public function init_classes( $dir = '' ) { } } + /** + * Retrieves a fully loadable class using reflection. + * + * @param string $class_name The name of the class to load. + * + * @return false|ReflectionClass Returns a ReflectionClass instance if the class is loadable, or false if it is not. + * + * @phpstan-ignore missingType.generics + */ + public function get_fully_loadable_class( string $class_name ): false|ReflectionClass { + try { + // Create a new reflection of the class. + // @phpstan-ignore argument.type + return new ReflectionClass( $class_name ); + } catch ( \Throwable $e ) { + // This includes ReflectionException, Error due to missing parent, etc. + return false; + } + } + /** * Slugify a class name. * diff --git a/tests/ModuleInitializationTest.php b/tests/ModuleInitializationTest.php index fb56172..ccf13db 100644 --- a/tests/ModuleInitializationTest.php +++ b/tests/ModuleInitializationTest.php @@ -134,4 +134,17 @@ public function test_only_classes_implementing_module_interface_are_initialized( $this->assertTrue( did_action( 'tenup_framework_module_init__tenupframeworktestclasses-posttypes-demo' ) > 0, 'Demo was not initialized.' ); $this->assertFalse( did_action( 'tenup_framework_module_init__tenupframeworktestclasses-standalone-standalone' ) > 0, 'Standalone class was initialized.' ); } + + /** + * Validate if the classes are fully loadable. + * + * @return void + */ + public function testIsClassFullyLoadable() { + $module_init = \TenupFramework\ModuleInitialization::instance(); + + $this->assertInstanceOf( 'ReflectionClass', $module_init->get_fully_loadable_class( '\TenupFrameworkTestClasses\Loadable\BaseClass' ) ); + $this->assertInstanceOf( 'ReflectionClass', $module_init->get_fully_loadable_class( '\TenupFrameworkTestClasses\Loadable\ChildClass' ) ); + $this->assertFalse( $module_init->get_fully_loadable_class( '\TenupFrameworkTestClasses\Loadable\InvalidChildClass' ) ); + } }