-
Couldn't load subscription status.
- Fork 45
9.0.0-beta.4 PHP 7.4 class ordering bug resulting in Fatal ErrorΒ #140
Description
In 9.0.0-beta.4, in Sober\Controller\Loader::setInstance() there appears to be an issue when using PHP 7.4. The code assumes that the last class returned by get_declared_classes() is the one that should be mapped to the template, however, in PHP 7.4 the final class returned is Sober\Controller\Controller. This works correctly under PHP 7.3.
For example, under PHP 7.3, the results of a var_dump on get_declared_classes() produces:
...
[1738]=>
string(44) "Yoast\WP\SEO\Conditionals\XMLRPC_Conditional"
[1739]=>
string(23) "Sober\Controller\Loader"
[1740]=>
string(27) "Sober\Controller\Controller"
[1741]=>
string(20) "App\TemplateVocation"
Under PHP 7.4 we are seeing:
...
[1906]=>
string(44) "Yoast\WP\SEO\Conditionals\XMLRPC_Conditional"
[1907]=>
string(23) "Sober\Controller\Loader"
[1908]=>
string(16) "App\TemplateNews"
[1909]=>
string(27) "Sober\Controller\Controller"
Since an upgrade to 2.x.x would be fairly significant a suggested quick fix patch to 9.0.0-beta.4 would be:
diff --git a/src/Loader.php b/src/Loader.php
index 11bc8c4..0b13911 100644
--- a/src/Loader.php
+++ b/src/Loader.php
@@ -77,8 +77,12 @@ class Loader
*/
protected function setInstance()
{
- $class = get_declared_classes();
- $class = '\\' . end($class);
+ $classes = get_declared_classes();
+ $class = array_pop($classes);
+ if (strpos($class, "Sober") === 0) {
+ $class = array_pop($classes);
+ }
+ $class = '\\' . $class;
$template = pathinfo($this->instance, PATHINFO_FILENAME);
// Convert camel case to match template
$template = strtolower(preg_replace('/(?<!^)[A-Z]/', '-$0', $template));
I appreciate the 9.0.0-beta code is no longer being worked on but it great if this could be included in a tag to help some of us that are still using it.
Thanks