利用反射api來加載模塊

  1. <?php 
  2. /* 
  3.  * Created on 2011-5-16 
  4.  * 
  5.  * To change the template for this generated file go to 
  6.  * Window - Preferences - PHPeclipse - PHP - Code Templates 
  7.  */ 
  8. //假設我們要創建要給類來動態調用Module對象,即該類可以自由加載第三 
  9. //方插件並集成進已有的系統,而不需要把第三方的代碼硬編碼進原有的代 
  10. //碼。要達到這個目的,可以在Module接口或抽象類中定義一個execute() 
  11. //方法,強制要求所有的子類都必須實現該方法。可以允許用戶在外部XML配 
  12. //置文件中列出所有Module類。系統可以使用XML提供的信息來加載一定數目 
  13. //的Module對象,然後調用其中的execute(). 
  14. // 
  15. //    然而,如果每個Module需要不同的信息來完成任務,應該怎麼做呢? 
  16. //    這這種情況下,XML文件可以爲每個Module提供屬性鍵和值,Module 
  17. //    的創建者可以爲每個屬性名提供setter方法。代碼要確保根據某個屬 
  18. //    性名調用正確的setter方法。 
  19.  
  20.  
  21.  class Person { 
  22.        public    $name
  23.  
  24.        function __construct($name
  25.        { 
  26.            $this->name = $name
  27.        } 
  28.  } 
  29.  
  30. interface Module{ 
  31.  
  32.      function execute(); 
  33.  
  34.  
  35.  
  36.  
  37. class FtpModule implements Module{ 
  38.  
  39.      function setHost($host){ 
  40.  
  41.          print "FtpModule::setHost():$host\n<br>"
  42.  
  43.      } 
  44.  
  45.     function setUser($user
  46.     { 
  47.  
  48.        print "FtpModule::setUser():$user\n<br>"
  49.  
  50.     } 
  51.  
  52.    function execute() 
  53.    { 
  54.  
  55.  
  56.     } 
  57.  
  58.  
  59.  
  60.  
  61. class PersonModule  implements Module{ 
  62.  
  63.  
  64.     function setPerson(Person $person
  65.     { 
  66.  
  67.          print "PersonModule::setPerson():{$person->name}\n<br>"
  68.  
  69.    } 
  70.  
  71.  
  72.  
  73.    function execute() 
  74.    { 
  75.  
  76.  
  77.  
  78.    } 
  79.  
  80.  
  81.  
  82. class ModuleRunner { 
  83.  
  84.      private $modules = array(); 
  85.  
  86.      private $configData = array
  87.  
  88.               "PersonModule"=> array('person'=>'bob'), 
  89.  
  90.               "FtpModule"=> array('host'=>'example.com','user'=>'anon' )); 
  91.  
  92.     public function init() 
  93.             { 
  94.               $interface = new ReflectionClass('Module'); 
  95.  
  96.                foreach($this->configData as $modulename =>$params
  97.                { 
  98.                     $module_class = new ReflectionClass($modulename); 
  99.  
  100.                     if(!$module_class->isSubclassOf($interface)){ 
  101.  
  102.                        throw new Exception("unkown module type:$modulename"); 
  103.                 } 
  104.  
  105.                    $module = $module_class->newInstance(); 
  106.  
  107.                    foreach($module_class->getMethods()  as $method ) 
  108.                    { 
  109.  
  110.                           $this->handleMethod($module,$method,$params); 
  111.  
  112.                    } 
  113.  
  114.                    array_push($this->modules,$module); 
  115.  
  116.                 } 
  117.  
  118.               } 
  119.  
  120.  
  121.     public function handleMethod(Module $module,ReflectionMethod $method,$params
  122.             { 
  123.                   $name = $method->getName(); 
  124.  
  125.                   $args  = $method->getParameters(); 
  126.  
  127.  
  128.  
  129.                  if(count($args)!=1 || substr($name,0,3)!="set") { 
  130.                     return false; 
  131.                   } 
  132.  
  133.                  $propertystrtolower(substr($name,3)); 
  134.  
  135.                  if(!isset($params[$property]) ){ return false;} 
  136.  
  137.  
  138.                    $arg_class = $args[0]->getClass(); 
  139.  
  140.                  if(emptyempty($arg_class) ){ 
  141.  
  142.  
  143.                 $method->invoke($module,$params[$property]); 
  144.  
  145.                 }else
  146.  
  147.                 $method->invoke($module,$arg_class->newInstance($params[$property])); 
  148.  
  149.                 } 
  150.  
  151.  
  152.     } 
  153.  
  154.  
  155.   } 
  156.  
  157. $test = new ModuleRunner(); 
  158.  
  159. $test->init(); 
  160.  
  161. ?> 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章