每日学习笔记(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();
?>
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();
?>
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
posted on 2010-09-30 11:38 Phinecos(洞庭散人) 阅读(889) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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)