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代码
Mar 03 PHP
PHP 开源AJAX框架14种
Aug 24 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
使用PHP Socket写的POP3类
Oct 30 PHP
PHP文件操作方法汇总
Jul 01 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
详解使用php调用微信接口上传永久素材
Apr 11 PHP
php之可变函数的实例详解
Sep 13 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 PHP
php压缩文件夹最新版
Jul 18 PHP
PHP PDOStatement::setAttribute讲解
Feb 01 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/17 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
教大家制作简单的php日历
2015/11/17 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
javascript开发技术大全-第3章 js数据类型
2011/07/03 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
2016/03/13 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
Python中函数参数调用方式分析
2018/08/09 Python
python面向对象法实现图书管理系统
2019/04/19 Python
Django之路由层的实现
2019/09/09 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
Python json读写方式和字典相互转化
2020/04/18 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
成功的酒店创业计划书
2013/12/27 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
小学二年级学生评语
2014/04/21 职场文书
责任书格式范文
2014/07/28 职场文书