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 相关文章推荐
php学习笔记 数组的常用函数
Jun 13 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
PHP中实现crontab代码分享
Mar 26 PHP
codeigniter实现get分页的方法
Jul 10 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
浅谈PHP中new self()和new static()的区别
Aug 11 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
PHP合并两个或多个数组的方法
Jan 20 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 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
PHP中GET变量的使用
2006/10/09 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
destoon各类调用汇总
2014/06/20 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
javascript闭包的理解和实例
2010/08/12 Javascript
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
详解javascript高级定时器
2015/12/31 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
跨域修改iframe页面内容详解
2019/10/31 HTML / CSS
银行介绍信范文
2014/01/10 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
创业计划书的主要内容有哪些
2014/01/29 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
工作收入住址证明
2014/10/28 职场文书
毕业生个人总结
2015/02/28 职场文书
通知的写法
2015/04/23 职场文书