反射实现加依赖注入

前端之家收集整理的这篇文章主要介绍了反射实现加依赖注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. <?PHP
  2.  
  3. //这里定义一个Person类
  4. class Person
  5. {
  6. public $name;
  7. function __construct($name)
  8. {
  9. $this->name=$name;
  10. }
  11. }
  12.  
  13. //定义了一个接口Module
  14. interface Module
  15. {
  16. function execute();
  17. }
  18.  
  19. //定义FtpModule类
  20. class FtpModule implements Module
  21. {
  22. function setHost($host)
  23. {
  24. print "FtpModule::setHost():$host\n";
  25. }
  26.  
  27. function setUser($user)
  28. {
  29. print "FtpModule::setUser():$user\n";
  30. }
  31.  
  32. function execute()
  33. {
  34. //something
  35. }
  36. }
  37.  
  38.  
  39. class PersonModule implements Module
  40. {
  41. function setPerson(Person $person)
  42. {
  43. print "PersonModule::setPerson:{$person->name}\n";
  44. }
  45.  
  46. function execute()
  47. {
  48. //something
  49. }
  50. }
  51.  
  52. class ModuleRunner
  53. {
  54. private $configData=array(
  55. "PersonModule"=>array('person'=>'bob'),"FtpModule"=>array('host'=>'example.com','user'=>'anon')
  56. );
  57. private $modules=array();
  58. function init()
  59. {
  60. $interface=new ReflectionClass('Module');
  61. foreach($this->configData as $modulename=>$params)
  62. {
  63. $module_class=new ReflectionClass($modulename);//根据配置configData的名称,实例化ReflectionClass
  64. if(!$module_class->isSubclassOf($interface))
  65. {//检查反射得到了类是否是$interface的子类
  66. throw new Exception("unknown module type:$modulename");//不是Module子类则抛出异常
  67. }
  68. $module=$module_class->newInstance();//实例化一个FtpModule或者PersonModule对象
  69. foreach($module_class->getMethods() as $method)
  70. {//获得类中的方法
  71. $this->handleMethod($module,$method,$params);
  72. }
  73. array_push($this->modules,$module);//将实例化的module对象放入$modules数组中
  74. }
  75. }
  76.  
  77. function handleMethod(Module $module,ReflectionMethod $method,$params)
  78. {
  79. $name=$method->getName();//获得方法名称
  80. $args=$method->getParameters();//获得方法中的参数
  81. if(count($args)!=1||substr($name,3)!="set")
  82. {//检查方法必须是以set开头,且只有一个参数
  83. return false;
  84. }
  85. $property=strtolower(substr($name,3));//讲方法名去掉set三个字母,作为参数
  86. if(!isset($params[$property]))
  87. {//如果$params数组不包含某个属性,就返回false
  88. return false;
  89. }
  90. $arg_class=@$args[0]->getClass;//检查setter方法的第一个参数(且唯一)的数据类型
  91. if(empty($arg_class))
  92. {
  93. $method->invoke($module,$params[$property]);
  94. }
  95. else
  96. {
  97. $method->invoke($module,$arg_class->newInstance($params[$property]));
  98. }
  99. }
  100. }
  101. $test=new ModuleRunner();
  102. $test->init();
  103. ?>

猜你在找的设计模式相关文章