リフレクション API のプラグイン メソッドは、実行時のプログラムの機能の決定に基づいています。つまり、オプションのインターフェイス メソッドの作成が可能であり、最初に使用されるときにインターフェイス メソッドのこの部分のみが存在することが検出されます。プラグイン内でそれらはインターフェースがある場合にのみ使用されます
コードをコピーします コードは次のとおりです:
interface IPlugin{
function getMenuItems() ;
function getArticles();
function getSideBars ();
class Somepluginimplelents IPlugin{
//メニュー項目はありません
return null;
public function getArticles(){記事
return null;
}
public function getSidBars(){
//with Side
return array("sidbarItem');
}
}
[html]
この状況は、次の要件を満たしているため、あまり合理的ではありません。 API に数百のメソッドがある場合、使用される関数本体は機能しません。リフレクション API は、get_declared_classes() 関数を使用して解決策を提供します。現在ロードされているクラスを調べて、どのクラスがそれを実装しているかを検出します。
リフレクションを使用してプラグインを見つける方法です
[コード]
function findPlugins(){
$plugins=array()
foreach (get_declared_classes(); $class){
$reflectionsClass=new ReflectionClass($class);
if($reflectionsClass->implementsInterface('IPlugin')){
$plugins[]=$reflectionsClass
}
}
return $plugins;
}
for order クラスが単一のメソッドを実装しているかどうかを判断するには、REfectionClass クラスの hasMethod() メソッドを使用できます。
メニューに使用されるクラスのメンバーを決定します
コードをコピーします
コードは次のとおりです。
functioncomputerMenu(){ $menu= array(); foreach (findPlugins() as $plugin){
if($plugin->hasMethod('getMenuItems')){
$reflectionMethod=$plugin->getMethod('getMenuItems');
if( $reflectionMethod->isStatic()){
$items=$reflectionMethod->invoke(null);
$pluginInstance= $plugin->newInstance();
$items=$reflectionMethod->
}
$menu=array_merge($menu,$items);
$menu;
クラスのインスタンスを取得した後、API メソッドが静的に検出できるかどうかを確認する必要があります。メソッドが静的である場合は、invoke() 関数を呼び出すだけです。
次のように publicmixedinvoke(stdclass object 、混合 args=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); =array_merge($articles,$items);
}
}
return $articles;
function computeSidebars(){
$sidebars=array();
foreach (findPlugins() as $plugin){
if($プラグイン-> 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 は 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'=>'これは本当に素晴らしい記事です',
'text'=>'この記事は...'));
}
public static function getSideBars(){
//記事のサイドバー インデックス配列
return array(array('sideBars'=>'/MyCoolPlugin'));
}
}
最後に、このプラグインを使用できます:
コードをコピーします コードは次のとおりです:
$menu=computeArticles();
$articles=computeArticles(); ) ;
http://www.bkjia.com/PHPjc/321893.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/321893.html
技術記事リフレクション API のプラグイン メソッドは、実行時のプログラムの機能の決定に基づいています。つまり、オプションのインターフェイス メソッドの作成が可能であり、最初に使用されるときにインターフェイス メソッドのこの部分を検出します...