每日学习笔记(11)

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

复制代码
代码
<?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();
?>
复制代码

 

 

posted on   Phinecos(洞庭散人)  阅读(889)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2006-09-30 FotoVision学习手记(1)

导航

统计

点击右上角即可分享
微信分享提示