<?php class Generic { public function Hello() { echo 'Hello!'; } } ?>
<?php class PluginFoo extends Generic_PluginFoo { public function Hello() { echo 'Dudes?<br />'; parent::Hello(); } } ?>
<?php class PluginBar extends Generic_PluginBar { public function Hello() { parent::Hello(); echo '<br />O.o'; } } ?>
Dudes?
Hello!
Oo
// ( ) $KungFu = new KungFu(); // PluginFoo Generic $KungFu->RegisterPlugin('Generic', 'PluginFoo'); // PluginBar Generic $KungFu->RegisterPlugin('Generic', 'PluginBar'); // <i></i> Generic $Generic = $KungFu->Load('Generic'); $Generic->Hello();
class KungFu { // ... public function __construct() { spl_autoload_register(array($this, '_AutoLoader')); } // ... public function _AutoLoader($sClass) { if (false == class_exists($sClass)) { include($sClass.'.php'); } } // // Array ( [Generic] => Array ( [0] => PluginFoo [1] => PluginBar ) ) private $_aPlugins = array(); // , , public function RegisterPlugin($sClass, $sPlugin) { if (false == isset($this->_aPlugins[$sClass])) { $this->_aPlugins[$sClass] = array(); } array_push($this->_aPlugins[$sClass], $sPlugin); } // . , . public function Load($sClass) { if (false == isset($this->_aPlugins[$sClass])) { return new $sClass(); } else { $aPlugins = array_reverse($this->_aPlugins[$sClass]); $sPrev = null; foreach ($aPlugins as $sPlugin) { if (null != $sPrev) { $aBranch[$sPrev] = $sPlugin; } $aBranch[$sPlugin] = null; $sPrev = $sPlugin; } $aBranch[$sPrev] = $sClass; foreach (array_reverse($aBranch) as $sPlugin => $sParent) { class_alias($sParent, $sClass.'_'.$sPlugin); } if (class_exists($sPlugin)) { return new $sPlugin; } } } }
Source: https://habr.com/ru/post/116713/