每日学习笔记(11)

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

ExpandedBlockStart.gif代码
<?php
class Person
{
    
public $name;
    
function __construct($name
    {
        
$this->name = $name;
    }
}
interface IModule
{
    
function execute();
}
class FtpModule implements IModule
{
    
function execute()
    {
    }
    
function setHost($host
    {
        
print "FtpModule::setHost: {$host}\n";
    }
    
function setUser($user)
    {
        
print "FtpModule::setUser: {$user}\n";
    }
}
class PersonModule implements IModule
{
    
function execute()
    {
    }
    
function setPerson(Person $person)
    {
        
print "PersonModule::setPerson: {$person->name}\n";
    } 
}
class ModuleRunner
{
    
private $configData = array("PersonModule" => array('person'=>'bob'),
                                
"FtpModule" => array('host' => 'google.com','user' => 'phinecos')
                               );
    
private $modules = array();
    
function init()
    {
        
$interface = new ReflectionClass('IModule');
        
foreach$this->configData as $moduleName => $params) {
            
$module_class = new ReflectionClass($moduleName);
            
if ( !$module_class -> isSubclassOf($interface) ) {
                
throw new Exception("unknown module: $moduleName");
            }
            
$module = $module_class->newInstance();
            
foreach$module_class->getMethods() as $method) {
                
$this->handleMethod($module, $method, $params);
            }
            
array_push($this->modules, $module);
        }
    }
    
function handleMethod(IModule $module, ReflectionMethod $method, $params)
    {
        
$name = $method->getName();
        
$args = $method->getParameters();
        
if (count($args!= 1 || substr($name, 0, 3!= "set") {
            
return false;
        }
        
$property = strtolower(substr($name, 3));
        
if ( !isset($params[$property])) {  
            
return false;
        }
        
$arg_class = $args[0]->getClass();
        
        
if ( empty($arg_class)) {
            
$method->invoke($module, $params[$property]);
        } 
else {
            
$method->invoke($module, $arg_class->newInstance($params[$property]));
        }
    }
}
$test = new ModuleRunner();
$test->init();
?>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值