3v4l.org

run code in 300+ PHP versions simultaneously
<?php /** * Module creator */ Class Module { public function __construct($module) { $this->module = new System; } public function extensions($extension) { // In real life, we scan the $extension directory for class names // For now we hardcode a few here return [ 'SystemSettingsProfile', 'SystemSettingsPrivacy', 'SystemSettingsAccount', ]; } } /** * System service provider */ class System {} /** * System profile extensions */ abstract class Extension { public function render() { return get_called_class(); } public static function getTabs() { return get_called_class(); } } class SystemSettingsProfile extends Extension {} class SystemSettingsPrivacy extends Extension {} class SystemSettingsAccount extends Extension {} /** * Controller */ class Controller { public function index() { $extensions = (new Module('system'))->extensions('profile'); foreach($extensions as $extension) { $tabs[] = $extension::getTabs(); // Real-life: control structure checks if route key matches extension key // Except now we just keep overriding $content with the last $content = (new $extension)->render(); } var_dump($tabs, $content); } } (new Controller)->index();

preferences:
48.66 ms | 402 KiB | 5 Q