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 05 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
ecshop后台编辑器替换成ueditor编辑器
Mar 03 PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
Oct 12 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
PHP区块查询实现方法分析
May 12 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 PHP
PHP autoload使用方法及步骤详解
Sep 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性能优化的介绍
2013/06/20 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
php集成动态口令认证
2016/07/21 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
浅谈js中的bind
2019/03/18 Javascript
Python代码缩进和测试模块示例详解
2018/05/07 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
python八皇后问题的解决方法
2018/09/27 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
python面向对象法实现图书管理系统
2019/04/19 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
python基于event实现线程间通信控制
2020/01/13 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
介绍下java.util.Arrays类
2012/10/16 面试题
个人求职信范文分享
2014/01/06 职场文书
劳动实践课感言
2014/02/01 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
投标诚信承诺书
2014/05/26 职场文书
培训后的感想
2015/08/07 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis