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 相关文章推荐
网络资源
Oct 09 PHP
PHP Smarty生成EXCEL文档的代码
Aug 23 PHP
PHP中计算字符串相似度的函数代码
Dec 29 PHP
PHP下使用CURL方式POST数据至API接口的代码
Feb 14 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
Sep 22 PHP
php生成RSS订阅的方法
Feb 13 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 PHP
关于laravel 子查询 &amp; join的使用
Oct 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 裁剪图片成固定大小代码方法
2009/09/09 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
vuejs指令详解
2017/02/07 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
用python制作游戏外挂
2018/01/04 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
Python中qutip用法示例详解
2020/10/02 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
市场开发与营销专业求职信
2013/12/31 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
安全生产月演讲稿
2014/05/09 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
2014年关工委工作总结
2014/11/17 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书