Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions fixtures/classes/Loadable/BaseClass.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php
/**
* BaseClass
*
* @package TenUpPlugin\Loadable
*/

declare(strict_types = 1);

namespace TenupFrameworkTestClasses\Loadable;

/**
* A base class.
*/
class BaseClass {

}
19 changes: 19 additions & 0 deletions fixtures/classes/Loadable/ChildClass.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php
/**
* ChildClass
*
* @package TenUpPlugin\Loadable
*/

declare(strict_types = 1);

namespace TenupFrameworkTestClasses\Loadable;

use TenupFrameworkTestClasses\Loadable\BaseClass;

/**
* Represents a class that extends the functionality of BaseClass.
*/
class ChildClass extends BaseClass {

}
21 changes: 21 additions & 0 deletions fixtures/classes/Loadable/InvalidChildClass.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php
/**
* InvalidChildClass
*
* @package TenUpPlugin\Loadable
*/

declare(strict_types = 1);

namespace TenupFrameworkTestClasses\Loadable;

/**
* Represents a class that attempts to extend a non-existent or invalid superclass.
*
* This class is invalid due to the parent class not being defined or available.
* Ensure that the parent class exists and is properly imported or declared
* in order to resolve this issue.
*/
class InvalidChildClass extends NonExistentClass {

}
2 changes: 2 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ parameters:
paths:
- src/
- fixtures/classes/
excludePaths:
- fixtures/classes/Loadable/InvalidChildClass.php
reportUnmatchedIgnoredErrors: false
level: 10
ignoreErrors:
Expand Down
28 changes: 25 additions & 3 deletions src/ModuleInitialization.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,11 @@ public function init_classes( $dir = '' ) {
continue;
}

// Create a new reflection of the class.
// @phpstan-ignore argument.type
$reflection_class = new ReflectionClass( $class );
$reflection_class = $this->get_fully_loadable_class( $class );

if ( ! $reflection_class ) {
continue;
}

// Using reflection, check if the class can be initialized.
// If not, skip.
Expand Down Expand Up @@ -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.
*
Expand Down
13 changes: 13 additions & 0 deletions tests/ModuleInitializationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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' ) );
}
}