1,php中反射API应用的一个实例

 

  1. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php 
  2. class Person 
  3.     public $name
  4.     function __construct($name)  
  5.     { 
  6.         $this->name = $name
  7.     } 
  8. interface IModule 
  9.     function execute(); 
  10. class FtpModule implements IModule 
  11.     function execute() 
  12.     { 
  13.     } 
  14.     function setHost($host)  
  15.     { 
  16.         print "FtpModule::setHost: {$host}\n"
  17.     } 
  18.     function setUser($user
  19.     { 
  20.         print "FtpModule::setUser: {$user}\n"
  21.     } 
  22. class PersonModule implements IModule 
  23.     function execute() 
  24.     { 
  25.     } 
  26.     function setPerson(Person $person) 
  27.     { 
  28.         print "PersonModule::setPerson: {$person->name}\n"
  29.     }  
  30. class ModuleRunner 
  31.     private $configData = array("PersonModule" => array('person'=>'bob'), 
  32.                                 "FtpModule" => array('host' => 'google.com','user' => 'phinecos'
  33.                                ); 
  34.     private $modules = array(); 
  35.     function init() 
  36.     { 
  37.         $interface = new ReflectionClass('IModule'); 
  38.         foreach( $this->configData as $moduleName => $params) { 
  39.             $module_class = new ReflectionClass($moduleName); 
  40.             if ( !$module_class -> isSubclassOf($interface) ) { 
  41.                 throw new Exception("unknown module: $moduleName"); 
  42.             } 
  43.             $module = $module_class->newInstance(); 
  44.             foreach( $module_class->getMethods() as $method) { 
  45.                 $this->handleMethod($module, $method, $params); 
  46.             } 
  47.             array_push($this->modules, $module); 
  48.         } 
  49.     } 
  50.     function handleMethod(IModule $module, ReflectionMethod $method, $params) 
  51.     { 
  52.         $name = $method->getName(); 
  53.         $args = $method->getParameters(); 
  54.         if (count($args) != 1 || substr($name, 0, 3) != "set") { 
  55.             return false
  56.         } 
  57.         $property = strtolower(substr($name, 3)); 
  58.         if ( !isset($params[$property])) {   
  59.             return false
  60.         } 
  61.         $arg_class = $args[0]->getClass(); 
  62.          
  63.         if ( empty($arg_class)) { 
  64.             $method->invoke($module, $params[$property]); 
  65.         } else { 
  66.             $method->invoke($module, $arg_class->newInstance($params[$property])); 
  67.         } 
  68.     } 
  69. $test = new ModuleRunner(); 
  70. $test->init();