ホームページ > バックエンド開発 > PHPチュートリアル > PHP_PHP チュートリアルのリフレクション技術を使用したアーキテクチャ プラグインの使用手順

PHP_PHP チュートリアルのリフレクション技術を使用したアーキテクチャ プラグインの使用手順

WBOY
リリース: 2016-07-21 15:37:36
オリジナル
731 人が閲覧しました

リフレクション 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
tru​​e

http://www.bkjia.com/PHPjc/321893.html

リフレクション API のプラグイン メソッドは、実行時のプログラムの機能の決定に基づいています。つまり、オプションのインターフェイス メソッドの作成が可能であり、最初に使用されるときにインターフェイス メソッドのこの部分を検出します...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート