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 相关文章推荐
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
PHP操作XML作为数据库的类
Dec 19 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
Aug 01 PHP
基于PHP常用函数的用法详解
May 10 PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 PHP
PHP处理bmp格式图片的方法分析
Jul 04 PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 PHP
laravel解决迁移文件一次删除创建字段报错的问题
Oct 24 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
php强制运行广告的方法
2014/12/01 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
php多进程应用场景实例详解
2019/07/22 PHP
接收键盘指令的脚本
2006/06/26 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
Python实现购物车功能的方法分析
2017/11/10 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
Python何时应该使用Lambda函数
2019/07/02 Python
Python 如何提高元组的可读性
2019/08/26 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
Python解析微信dat文件的方法
2020/11/30 Python
简单介绍Object类的功能、常用方法
2013/10/02 面试题
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
《长城和运河》教学反思
2014/04/14 职场文书
交通事故委托书范本
2014/09/28 职场文书
论文答谢词
2015/01/20 职场文书
退休欢送会致辞
2015/07/31 职场文书
安全生产隐患排查制度
2015/08/05 职场文书