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中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
php通过asort()给关联数组按照值排序的方法
Mar 18 PHP
24条货真价实的PHP代码优化技巧
Jul 28 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
Sep 22 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 PHP
解决laravel 表单提交-POST 异常的问题
Oct 15 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 PHP
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 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
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
使用正则替换变量
2007/05/05 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
vue.js表格分页示例
2016/10/18 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
python查询mysql,返回json的实例
2018/03/26 Python
超简单使用Python换脸实例
2019/03/27 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
大学生实习自我鉴定
2013/12/11 职场文书
廉洁自律承诺书
2014/03/27 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
广播体操比赛主持词
2015/06/29 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL