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获取Google AJAX Search API 数据的代码
Mar 12 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
php页面缓存方法小结
Jan 10 PHP
Linux系统下php获得系统分区信息的方法
Mar 30 PHP
php数组随机排序实现方法
Jun 13 PHP
PHP中的表达式简述
May 29 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 PHP
YII2框架使用控制台命令的方法分析
Mar 18 PHP
PHP 图片处理
Sep 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
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
关于crontab的使用详解
2013/06/24 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
python中__slots__用法实例
2015/06/04 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
python多线程之事件Event的使用详解
2018/04/27 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
pytest中文文档之编写断言
2019/09/12 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
Django-migrate报错问题解决方案
2020/04/21 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
英文版区域经理求职信
2013/10/23 职场文书
新学期教师寄语
2014/04/02 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
2015年暑假工作总结
2015/07/13 职场文书
python单元测试之pytest的使用
2021/06/07 Python
深入理解go slice结构
2021/09/15 Golang
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript
Win11开始菜单添加休眠选项
2022/04/19 数码科技
详解如何使用Nginx解决跨域问题
2022/05/06 Servers