рдХреНрд▓рд╛рд╕ рдкреНрд▓рдЧрдЗрди

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреА рдирдИ рдмрд╛рдЗрдХ рдкрд░ рдзреНрдпрд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рдерд╛, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, "рдХреНрдпреЛрдВ рдирд╣реАрдВ" рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ "рдкреНрд▓рдЧрдЗрди" рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЗрд╕рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдП?

рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдзрд╛рд░ рд╢реНрд░реЗрдгреА Generic.php рд╣реИ :
<?php class Generic { public function Hello() { echo 'Hello!'; } } ?> 


рдФрд░ рд╣рдо рдЗрд╕ рдкрд░ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдХреЗ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХреЛ рдкреВрд░рдХ / рдмрджрд▓ рджреЗрдВрдЧреЗ ("рдкрд╣рд▓реЗ рдЙрдареЗ рдФрд░ рдЪрдкреНрдкрд▓ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░")ред

рдпрд╣рд╛рдБ рд╡реЗ рд╕реБрдВрджрд░ рд╣реИрдВ:
PluginFoo.php :
 <?php class PluginFoo extends Generic_PluginFoo { public function Hello() { echo 'Dudes?<br />'; parent::Hello(); } } ?> 

рдФрд░ PluginBar.php :
 <?php class PluginBar extends Generic_PluginBar { public function Hello() { parent::Hello(); echo '<br />O.o'; } } ?> 


рдФрд░ рдлрд┐рд░ рд╣рдо рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВрдЧреЗ (рдЕрдВрддрд┐рдо рд╡рдВрд╢ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛), рд╣реИрд▓реЛ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдФрд░ рдпрд╣ рд╣рдореЗрдВ рдмрддрд╛рдПрдЧрд╛:
рджреЛрд╕реНрддреЛрдВ?
рдирдорд╕реНрдХрд╛рд░!
рдК


рдиреАрдЪреЗ рдПрдХ рд▓рд╛рдЗрд╡реЙрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ ort рдиреЗ рдЕрдкрдиреЗ LiveStreet рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдЕрдкрдиреА рдмрд╛рдЗрдХ рдореЗрдВред

рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдкреНрд▓рдЧрдЗрди рдХреНрд▓рд╛рд╕реЗрд╕ PluginFoo рдФрд░ PluginBar рдХреНрд░рдорд╢рдГ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрдХреНрд╖рд╛рдУрдВ Generic_PluginFoo рдФрд░ Generic_PluginBar рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ? рддреЛ рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдХреНрд▓рд╛рд╕рд┐рд╕рд┐рдВрдЧ рдФрд░ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рд╛рдордВрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд░рдмрд░ рдХреНрдпреЛрдВ рдЦреАрдВрдЪреЗ?
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 //   (  ) $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/In116713/


All Articles