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 CLI实现简单的数据库实时监控调度
Jul 01 PHP
整理的9个实用的PHP库简介和下载
Nov 09 PHP
php文本转图片自动换行的方法
Mar 13 PHP
php通过正则表达式记取数据来读取xml的方法
Mar 09 PHP
php中session定期自动清理的方法
Nov 12 PHP
详解PHP的Yii框架中的Controller控制器
Mar 29 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
PHP实现多图上传(结合uploadify插件)思路分析
Nov 30 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 PHP
关于laravel 子查询 &amp; join的使用
Oct 16 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 PHP
PHP数组array类常见操作示例
May 15 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
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
js微信分享接口调用详解
2019/07/23 Javascript
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
用python写一个定时提醒程序的实现代码
2019/07/22 Python
pip安装python库的方法总结
2019/08/02 Python
python创建n行m列数组示例
2019/12/02 Python
基于python实现对文件进行切分行
2020/04/26 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
师范大学应届生求职信
2013/11/21 职场文书
小学国庆节活动方案
2014/02/11 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
元旦寄语大全
2014/04/10 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
房屋出租委托书格式
2014/09/23 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
期中考试后的感想
2015/08/07 职场文书
社区结对共建协议书
2016/03/23 职场文书
Python中22个万用公式的小结
2021/07/21 Python