PHPにおける反射技術を用いたアーキテクチャプラグインの使用説明
4498 ワード
反射APIのプラグイン方法は、実行時にプログラムを決定する機能に基づいて実現する、すなわち、オプションのインタフェース方法の作成を可能にし、初回使用時にこのインタフェース方法の一部を検出する、プラグインにこのインタフェースが存在する場合にのみ使用される.
このようなインタフェースがあると仮定します
クラスが単一のメソッドを実装しているかどうかを決定するために、REfectionClassクラスのhasMethod()メソッドを使用します.
メニューに使用するクラスのメンバーの決定
クラスのインスタンスを取得すると、呼び出しAPIメソッドを静的に検出できるかどうかを検出する必要があり、メソッドが静的であればinvoke()関数を呼び出すだけで、
以下のpublic mixed invoke(stdclass object,mixed args=null)
一方、メソッドが静的でない場合は、Refectionclassオブジェクトからクラスのインスタンスを取得するためにプラグインのインスタンスを取得する必要があります.
そのnewInstance()メソッドを呼び出し、invoke()メソッドを使用してインスタンスの着信を返すとよい.
記事と側面のクラスのメンバーの決定
オプションのプロパティを実装した反射プラグインを作成
最後に、このようなプラグインを使用することができます.
このようなインタフェースがあると仮定します
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_declared_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;
}
クラスが単一のメソッドを実装しているかどうかを決定するために、REfectionClassクラスのhasMethod()メソッドを使用します.
メニューに使用するクラスのメンバーの決定
function computerMenu(){
$menu=array();
foreach (findPlugins() as $plugin){
if($plugin->hasMethod('getMenuItems')){
$reflectionMethod=$plugin->getMethod('getMenuItems');
if($reflectionMethod->isStatic()){
$items=$reflectionMethod->invoke(null);
}else{
$pluginInstance=$plugin->newInstance();
$items=$reflectionMethod->invoke($pluginInstance);
}
$menu=array_merge($menu,$items);
}
}
return $menu;
}
クラスのインスタンスを取得すると、呼び出しAPIメソッドを静的に検出できるかどうかを検出する必要があり、メソッドが静的であればinvoke()関数を呼び出すだけで、
以下のpublic mixed invoke(stdclass object,mixed 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);
}
$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);