服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - PHP教程 - 在PHP中使用反射技术的架构插件使用说明

在PHP中使用反射技术的架构插件使用说明

2019-10-30 16:25php教程网 PHP教程

基于反射的插件架构实际上并没有归类为一种模式,因为它实际上不是一个模板,而是一糸列组合在一起的形成程序架构的概念。

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

延伸 · 阅读

精彩推荐
  • PHP教程PHP数字金额转换成中文大写显示

    PHP数字金额转换成中文大写显示

    今天小编就为大家分享一篇关于PHP数字金额转换成中文大写显示,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    只是个宝宝3132019-07-07
  • PHP教程Yii2使用表单上传文件的实例代码

    Yii2使用表单上传文件的实例代码

    本篇文章主要介绍了Yii2使用表单上传文件的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    webclz1682019-08-30
  • PHP教程在PHP中输出JS语句以及乱码问题的解决方案

    在PHP中输出JS语句以及乱码问题的解决方案

    今天小编就为大家分享一篇关于在PHP中输出JS语句以及乱码问题的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友...

    Blue_Moon3682019-06-16
  • PHP教程使用PHPUnit进行单元测试并生成代码覆盖率报告的方法

    使用PHPUnit进行单元测试并生成代码覆盖率报告的方法

    这篇文章主要介绍了使用PHPUnit进行单元测试并生成代码覆盖率报告的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看...

    big_cat2112019-06-04
  • PHP教程PHP PDOStatement::setFetchMode讲解

    PHP PDOStatement::setFetchMode讲解

    今天小编就为大家分享一篇关于PHP PDOStatement::setFetchMode讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    php参考手册3142019-06-23
  • PHP教程thinkphp5.1 文件引入路径问题及注意事项

    thinkphp5.1 文件引入路径问题及注意事项

    这篇文章主要介绍了thinkphp5.1 文件引入路径问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 ...

    小小青年3902019-09-25
  • PHP教程PHP使用SMTP邮件服务器发送邮件示例

    PHP使用SMTP邮件服务器发送邮件示例

    这篇文章主要介绍了PHP使用SMTP邮件服务器发送邮件,结合实例形式分析了php基于SMTP协议的邮件发送类email.class.php定义与使用技巧,需要的朋友可以参考下...

    风轻云淡1805181572019-09-09
  • PHP教程php7安装openssl扩展方法

    php7安装openssl扩展方法

    下面小编就为大家分享一篇php7安装openssl扩展方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    污湖洞主4842019-10-16