リフレクション ベースのプラグインArchitecture は、実際にはテンプレートではなく、プログラム アーキテクチャを形成するためにまとめられる一連の概念であるため、実際にはパターンとして分類されません。
リフレクション API のプラグイン メソッドは、実行時のプログラムの機能の決定に基づいています。つまり、オプションのインターフェイス メソッドの作成が可能で、最初に使用されるときにインターフェイス メソッドのこの部分を検出します。プラグインに存在します。インターフェースのこの部分が存在する場合にのみ使用されます。
そのようなインターフェースがあると仮定します。
interface IPlugin{ function getMenuItems(); function getArticles(); function getSideBars(); } class Someplugin implelents IPlugin{ public function getMenuItems(){ //没有菜单项 return null; } public function getArticles(){ //没有任何文章 return null; } public function getSidBars(){ //有侧边 return array("sidbarItem'); } } [html] 这种情况并不太合理,因为满足了接口的要求,为大量方法添加了不会用到的函数体,如果在API中有数百个方法,这样是行不通的。 反射API提供了一种解决方法,使用get_ declare d_classes()函数取得当前加载的类,并检测哪个类实现了IPlugin"标记"的方法。 在这里写了一个使用反射查找插件的方法 [code] function findPlugins(){ $plugins=array(); foreach (get_declared_classes() as $class){ $reflectionsClass=new ReflectionClass($class); if($reflectionsClass->implementsInterface('IPlugin')){ $plugins[]=$reflectionsClass; } } return $plugins; }
クラスが単一のメソッドを実装しているかどうかを判断するには、hasMethod() メソッドを使用できます。 REfectionClass クラスの。
メニューに使用されるクラスのメンバーを決定します
function computerMenu(){ $menu=array(); foreach (findPlugins() as $plugin){ if($plugin->hasMethod('getMenuItems')){ $reflectionMethod=$plugin->getMethod('getMenuItems'); if($reflectionMethod->is Static ()){ $items=$reflectionMethod->invoke(null); }else{ $pluginInstance=$plugin->newInstance(); $items=$reflectionMethod->invoke($pluginInstance); } $menu= array_merge ($menu,$items); } } return $menu; }
クラスのインスタンスを取得した後、APIメソッドが静的検出できるかどうかを確認する必要があります。メソッドが静的である場合は、メソッドを呼び出すだけです。 invoke() 関数、
次のように publicmixedinvoke(stdclassobject,mixedargs=null)
一方、メソッドが静的でない場合は、このメソッドを呼び出すためにプラグインのインスタンスを取得する必要があります。 Refectionclass オブジェクトからクラスのインスタンスを取得し、その newInstance() メソッドを呼び出します。その後、invoke() メソッドを使用して、返されたインスタンスを渡すだけです。
記事とサイドバーに使用されるクラスのメンバーを決定します
function computeArticles(){ $articles=array(); foreach (findPlugins() as $plugin){ if($plugin->hasMethod('getArticles')){ $reflectionMethod=$plugin->getMethod('getArticles'); if($reflectionMethod->isStatic()){ $items=$reflectionMethod->invoke(null); }else{ $pluginInstance=$plugin->newInstance(); $items=$reflectionMethod->invoke($pluginInstance); } $articles=array_merge($articles,$items); } } return $articles; } function computeSidebars(){ $sidebars=array(); foreach (findPlugins() as $plugin){ if($plugin->hasMethod('getSidebars')){ $reflectionMethod=$plugin->getMethod('getSidebars'); if($reflectionMethod->isStatic()){ $items=$reflectionMethod->invoke(null); }else{ $pluginInstance=$plugin->newInstance(); $items=$reflectionMethod->invoke($pluginInstance); } $sidebars=array_merge($sidebars,$items); } } return $sidebars; }
オプション機能を実装するリフレクティブプラグインを作成します
class MyCoolPlugin implements IPlugin{ public static function getName(){return 'MyCoolPlugin';} public static function getMenuItems(){ //菜单项的数字索引数组 return array(array('description'=>'MyCoolPlugin','link'=>'/MyCoolPlugin')); } public static function getArticles(){ //文章的数字索引数组 return array(array('path'=>'/MyCoolPlugin','title'=>'This is a really cool article', 'text'=>'This article is cool because...')); } public static function getSideBars(){ //文章的侧边栏索引数组 return array(array('sideBars'=>'/MyCoolPlugin')); } }最後に、このプラグインを使用できます:
$menu=computeArticles(); $sidebars=computeSidebars(); $articles=computeArticles(); print_r($menu); print_r($sidebars); print_r($articles);
以上がPHPのリフレクション技術を使ったプラグイン例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。