PHP 反射机制实现动态代理的代码


Posted in PHP onOctober 22, 2008

演示用代码如下所示: 

<?php 
class ClassOne { 
function callClassOne() { 
print "In Class One"; 
} 
} 
class ClassOneDelegator { 
private $targets; 
function __construct() { 
$this->target[] = new ClassOne(); 
} 
function __call($name, $args) { 
foreach ($this->target as $obj) { 
$r = new ReflectionClass($obj); 
if ($method = $r->getMethod($name)) { 
if ($method->isPublic() && !$method->isAbstract()) { 
return $method->invoke($obj, $args); 
} 
} 
} 
} 
} 
$obj = new ClassOneDelegator(); 
$obj->callClassOne(); 
?>

输出结果:
In Class One
可见,通过代理类ClassOneDelegator来代替ClassOne类来实现他的方法。
同样的,如下的代码也是能够运行的:
<?php 
class ClassOne { 
function callClassOne() { 
print "In Class One"; 
} 
} 
class ClassOneDelegator { 
private $targets; 
function addObject($obj) { 
$this->target[] = $obj; 
} 
function __call($name, $args) { 
foreach ($this->target as $obj) { 
$r = new ReflectionClass($obj); 
if ($method = $r->getMethod($name)) { 
if ($method->isPublic() && !$method->isAbstract()) { 
return $method->invoke($obj, $args); 
} 
} 
} 
} 
} 
$obj = new ClassOneDelegator(); 
$obj->addObject(new ClassOne()); 
$obj->callClassOne(); 
?>
PHP 相关文章推荐
Smarty的配置与高级缓存技术分享
Jun 05 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
迅速确定php多维数组的深度的方法
Jan 07 PHP
ThinkPHP多语言支持与多模板支持概述
Aug 22 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
yii实现图片上传及缩略图生成的方法
Dec 04 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
Dec 16 PHP
PHP中函数内引用全局变量的方法
Oct 20 #PHP
sqlyog 中文乱码问题的设置方法
Oct 19 #PHP
mysql5的sql文件导入到mysql4的方法
Oct 19 #PHP
php flush类输出缓冲剖析
Oct 19 #PHP
PHP5+UTF8多文件上传类
Oct 17 #PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 #PHP
PHP中str_replace函数使用小结
Oct 11 #PHP
You might like
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
php中动态调用函数的方法
2015/03/16 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
js实现蒙版效果
2020/01/11 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
Python脚本实现集群检测和管理功能
2015/03/06 Python
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
python代码如何注释
2020/06/01 Python
旅游管理实习自我鉴定
2013/09/29 职场文书
个人简历自我评价八例
2013/10/31 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
MySQL中order by的执行过程
2022/06/05 MySQL