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 5.0对象模型深度探索之绑定
Sep 05 PHP
PHP取进制余数函数代码
Jan 19 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
Zend Framework常用校验器详解
Dec 09 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
Dec 04 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面向对象全攻略 (九)访问类型
2009/09/30 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
python实现网页录音效果
2020/10/26 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
2020/11/28 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
法国时尚童装网站:Melijoe
2016/08/10 全球购物
关于Assembly命名空间的三个面试题
2015/07/23 面试题
大学生农村教师实习自我鉴定
2013/09/21 职场文书
初二数学教学反思
2016/02/17 职场文书
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
Docker官方工具docker-registry案例演示
2022/04/13 Servers