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 memcache扩展的三种安装方法
Apr 26 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
Nov 18 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
Nov 19 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
YII2框架中使用yii.js实现的post请求
Apr 09 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
php分享朋友圈的实现代码
Feb 18 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 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
BBS(php &amp; mysql)完整版(七)
2006/10/09 PHP
一个简单的PHP&amp;MYSQL留言板源码
2020/07/19 PHP
Snoopy类使用小例子
2008/04/15 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
webpack构建react多页面应用详解
2017/09/15 Javascript
Python操作SQLite数据库的方法详解
2017/06/16 Python
python timestamp和datetime之间转换详解
2017/12/11 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
2014的自我评价
2014/01/13 职场文书
法制宣传口号
2014/06/16 职场文书
工作证明英文模板
2014/10/21 职场文书
委托书英文
2015/01/28 职场文书
学校中秋节活动总结
2015/03/23 职场文书
高中生军训感言
2015/08/01 职场文书
公司新员工欢迎词
2015/09/30 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书