diff --git a/lib/classes/component.php b/lib/classes/component.php index 76b74213498..274a40679db 100644 --- a/lib/classes/component.php +++ b/lib/classes/component.php @@ -283,7 +283,6 @@ class component { return $file; } - /** * Initialise caches, always call before accessing self:: caches. */ @@ -398,6 +397,17 @@ class component { } } + /** + * Reset the initialisation of the component utility. + * + * Note: It should not be necessary to call this in regular code. + * Please only use it where strictly required. + */ + public static function reset(): void { + // The autoloader will re-initialise if plugintypes is null. + self::$plugintypes = null; + } + /** * Check whether the cache content in the supplied cache is valid. * diff --git a/lib/phpunit/classes/advanced_testcase.php b/lib/phpunit/classes/advanced_testcase.php index e87be8c0565..674f9fbc579 100644 --- a/lib/phpunit/classes/advanced_testcase.php +++ b/lib/phpunit/classes/advanced_testcase.php @@ -79,8 +79,9 @@ abstract class advanced_testcase extends base_testcase { // Reset global state after test and test failure. $CFG = phpunit_util::get_global_backup('CFG'); $DB = phpunit_util::get_global_backup('DB'); - // This is _hacky_. We need to reset the autoloader, and this is the only way to do so right now. - (new ReflectionProperty(\core\component::class, 'plugintypes'))->setValue(null, null); + + // We need to reset the autoloader. + \core_component::reset(); } if (isset($e)) { diff --git a/lib/tests/component_test.php b/lib/tests/component_test.php index c1fa9a44cbc..5fb7eceb804 100644 --- a/lib/tests/component_test.php +++ b/lib/tests/component_test.php @@ -33,10 +33,9 @@ use ReflectionProperty; final class component_test extends \advanced_testcase { #[\Override] public function tearDown(): void { - $plugintypes = new ReflectionProperty(component::class, 'plugintypes'); - $plugintypes->setValue(null, null); - parent::tearDown(); + + component::reset(); } /** @@ -963,7 +962,7 @@ final class component_test extends \advanced_testcase { // We have to override the dirroot and libdir, and then reset the plugintypes property. $CFG->dirroot = $vfileroot->url(); $CFG->libdir = $vfileroot->url() . '/lib'; - (new ReflectionProperty(component::class, 'plugintypes'))->setValue(null, null); + component::reset(); // Existing classes do not break. $this->assertTrue(