そのため、たとえば、特定の基本クラス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()メソッドを呼び出すと、次のようになります。
おい?
こんにちは!
おお
以下は、 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; } } } }
そして今、私は質問があります-それは「パターンの言語」で何と呼ばれていますか? あなたはそれを何と呼びますか?
PSもちろん-この投稿はエイプリルフールがPSAで描いた結果です:)
-はい!