手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

PHP反射API--利用反射技术实现的插件系统架构

首页 > PHP >

纯COPY,没仔细看。。。。【先申明,我COPY对这段代码,主要是看他reflectionClass的应用,并非关注插件的应用。。。】

有爱好的人,可以学习一下。。

http://www.e897.com/Article/wlbc/php/200908/5377.html
  1. /** 
  2. * @name  PHP反射API--利用反射技术实现的插件系统架构 
  3. * @author :PHPCQ.COM 
  4. */  
  5. interface Iplugin{  
  6.         public static function getName();  
  7. }  
  8. function findPlugins(){  
  9.         $plugins = array();  
  10.         foreach (get_declared_classes() as $class){  
  11.                 $reflectionClass = new ReflectionClass($class);  
  12.                 if ($reflectionClass->implementsInterface('Iplugin')) {  
  13.                         $plugins[] = $reflectionClass;  
  14.                 }  
  15.         }  
  16.         return $plugins;  
  17. }  
  18. function computeMenu(){  
  19.         $menu = array();  
  20.         foreach (findPlugins() as $plugin){  
  21.                 if ($plugin->hasMethod('getMenuItems')) {  
  22.                         $reflectionMethod = $plugin->getMethod('getMenuItems');  
  23.                         if ($reflectionMethod->isStatic()) {  
  24.                                 $items = $reflectionMethod->invoke(null);  
  25.                         } else {  
  26.                                 $pluginInstance = $plugin->newInstance();  
  27.                                 $items = $reflectionMethod->invoke($pluginInstance);  
  28.                         }  
  29.                         $menu = array_merge($menu,$items);  
  30.                 }  
  31.         }  
  32.         return $menu;  
  33. }  
  34. function computeArticles(){  
  35.         $articles = array();  
  36.         foreach (findPlugins() as $plugin){  
  37.                 if ($plugin->hasMethod('getArticles')) {  
  38.                         $reflectionMethod = $plugin->getMethod('getArticles');  
  39.                         if ($reflectionMethod->isStatic()) {  
  40.                                 $items = $reflectionMethod->invoke(null);  
  41.                         } else {  
  42.                                 $pluginInstance = $plugin->newInstance();  
  43.                                 $items = $reflectionMethod->invoke($pluginInstance);  
  44.                         }  
  45.                         $articles = array_merge($articles,$items);  
  46.                 }  
  47.         }  
  48.         return $articles;  
  49. }  
  50. require_once('plugin.php');  
  51. $menu = computeMenu();  
  52. $articles  = computeArticles();  
  53. print_r($menu);  
  54. print_r($articles);  
  55.   
  56.   
  57. //plugin.php 代码如下  
  58. <?php  
  59. class MycoolPugin implements Iplugin {  
  60.         public static function getName(){  
  61.                 return 'MycoolPlugin';  
  62.         }  
  63.         public static function getMenuItems(){  
  64.                 return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));  
  65.         }  
  66.         public static function getArticles(){  
  67.                 return array(array('path'=>'/MycoolPlugin','title'=>'This is a really cool article','text'=>xxxxxxxxx));  
  68.         }  
  69. }  



本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

Tags: 反射, 插件

« 上一篇 | 下一篇 »

只显示10条记录相关文章

IE中iframe跨域丢失Session问题(续 p3p) (浏览: 29397, 评论: 0)
又拍网架构-又一个用到python的网站 (浏览: 27608, 评论: 0)
啊兴的更新 (浏览: 23496, 评论: 2)
walker早期文章:通过MySQL内置全文检索实现中文的相关检索 (浏览: 22713, 评论: 0)
还是架构:再谈 eBay 的扩展性最佳实践 (浏览: 22183, 评论: 0)
优化网站信息架构 (浏览: 20323, 评论: 0)
额。越狱好象成功了 (浏览: 19175, 评论: 0)
求职薪资最佳实践 (浏览: 18906, 评论: 0)
Web 浏览器,分辨率,操作系统最新分布数据 (浏览: 16353, 评论: 0)
SQL查询结果集对注入的影响及利用 (浏览: 15659, 评论: 0)

5条记录访客评论


发表评论

评论内容 (必填):