在PHP中使用反射技術的架構外掛程式使用說明

來源:互聯網
上載者:User

反射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_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);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.