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 相关文章推荐
第1次亲密接触PHP5(1)
Oct 09 PHP
聊天室php&amp;mysql(五)
Oct 09 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
php将数据库导出成excel的方法
May 07 PHP
php实现监控varnish缓存服务器的状态
Dec 30 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 PHP
完美解决thinkphp唯一索引重复时出错的问题
Mar 31 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
laravel 实现上传图片到本地和前台访问示例
Oct 21 PHP
laravel使用redis队列实例讲解
Mar 23 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
如何使用脚本模仿登陆过程
2006/11/22 PHP
mysql建立外键
2006/11/25 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
python re模块的高级用法详解
2018/06/06 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
python接口自动化框架实战
2020/12/23 Python
python 基于opencv操作摄像头
2020/12/24 Python
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
毕业生求职的求职信
2013/12/05 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
保安岗位职责
2014/02/21 职场文书
捐款活动总结
2014/08/27 职场文书
开展创先争优活动总结
2014/08/28 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年控辍保学工作总结
2014/12/08 职场文书