クラスプラグイン

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



そのため、たとえば、特定の基本クラス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で描いた結果です:)





-はい!



All Articles