クラスプラグイン

私は新しい自転車で瞑想していたので、「なぜコントローラーを「プラグイン」できるようにしないのか」と考えました。

そのため、たとえば、特定の基本クラス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'; } } ?> 


次に、親クラスのオブジェクトを作成し(最後の子孫にアクセスせずに)、Hello()メソッドを呼び出すと、次のようになります。
おい?
こんにちは!
おお


以下は、 ortLiveStreetで説明されている動作を達成した方法の簡潔なバージョンです。

おそらく上記のコードで、プラグインクラスPluginFooPluginBarがそれぞれ、 説明されていないクラスGeneric_PluginFooGeneric_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; } } } } 


そして今、私は質問があります-それは「パターンの言語」で何と呼ばれていますか? あなたはそれを何と呼びますか?

PSもちろん-この投稿はエイプリルフールがPSAで描いた結果です:)


-はい!

Source: https://habr.com/ru/post/J116713/


All Articles