[PHP] PHP反射API--利用反射技术实现的插件系统架构 →→→→→进入此内容的聊天室

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

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

这儿你可以回复上面这条便签

captcha