reflection plugin


SUBMITTED BY: phpsnippets

DATE: Oct. 21, 2015, 1:58 p.m.

FORMAT: Text only

SIZE: 2.3 kB

HITS: 1488

  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. class MycoolPugin implements Iplugin {
  52. public static function getName(){
  53. return 'MycoolPlugin';
  54. }
  55. public static function getMenuItems(){
  56. return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));
  57. }
  58. public static function getArticles(){
  59. return array(array('path'=>'/MycoolPlugin','title'=>'This is a really cool article','text'=> 'xxxxxxxxx' ));
  60. }
  61. }
  62. $menu = computeMenu();
  63. $articles = computeArticles();
  64. print_r($menu);
  65. print_r($articles);

comments powered by Disqus