php中通过虚代理实现延迟加载的实现代码


Posted in PHP onJune 10, 2011

这货是从 Martin 大神的《企业应用架构模式》中学到的,辅助 PHP 动态语言的特性,可以比 Java 轻松很多的实现延迟加载(LazyLoad)。基本原理是通过一个虚代理(Virtual Proxy)做占位符,一旦访问代理对象的某成员(方法或属性),加载就被触发。

不过我实现的这个版本有局限性:

只适用于对象,无法代理数组等基本数据类型(需要用 ArrayObject 一类的内置对象封装)
被代理之后,一些带有操作符重载性质的接口实现就失效了,例如 ArrayAccess 的索引器、Itreator 的迭代器,如果是用该代理来处理集合类型的延迟加载,还需要继承一个子类做特殊处理,以便外部用 foreach 迭代
demo

// 测试 
$v = new VirtualProxy(function(){ 
echo 'Now, Loading', "\n"; 
$a = new ArrayObject(range(1,100)); 
$a->abc = 'a'; 
// 实际使用中,这里调用的是 DataMapper 的 findXXX 方法 
// 返回的是领域对象集合 
return $a; 
}); 
// 代理对象直接当作原对象访问 
// 而此时构造方法传入的 callback 函数才被调用 
// 从而实现加载对象操作的延迟 
echo $v->abc . $v->offsetGet(50);

Virtual Proxy
/** 
* 虚代理,只有在被访问成员时才调用闭包函数生成目标对象。 
* 
* @author tonyseek 
* 
*/ 
class VirtualProxy 
{ 
private $holder = null; 
private $loader = null; /** 
* 虚代理,只有在被访问成员时才调用闭包函数生成目标对象。 
* 
* @param Closure $loader 生成被代理对象的闭包函数 
*/ 
public function __construct(Closure $loader) 
{ 
$this->loader = $loader; 
} 
/** 
* 代理成员方法的调用 
* 
* @param string $method 
* @param array $arguments 
* @throws BadMethodCallException 
* @return mixed 
*/ 
public function __call($method, array $arguments = null) 
{ 
$this->check(); 
if (!method_exists($this->holder, $method)) { 
throw new BadMethodCallException(); 
} 
return call_user_func_array( 
array(&$this->holder, $method), 
$arguments); 
} 
/** 
* 代理成员属性的读取 
* 
* @param string $property 
* @throws ErrorException 
* @return mixed 
*/ 
public function __get($property) 
{ 
$this->check(); 
if (!isset($this->holder->$property)) { 
throw new ErrorException(); 
} 
return $this->holder->$property; 
} 
/** 
* 代理成员属性的赋值 
* 
* @param string $property 
* @param mixed $value 
*/ 
public function __set($property, $value) 
{ 
$this->check(); 
$this->holder->$property = $value; 
} 
/** 
* 检查是否已经存在被代理对象,不存在则生成。 
*/ 
private function check() 
{ 
if (null == $this->holder) { 
$loader = $this->loader; 
$this->holder = $loader(); 
} 
} 
}
PHP 相关文章推荐
如何提高MYSQL数据库的查询统计速度 select 索引应用
Apr 11 PHP
php 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
Apr 17 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
Yii使用find findAll查找出指定字段的实现方法
Sep 05 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
PHP+Ajax实现验证码的实时验证
Jul 20 PHP
PHP中的密码加密的解决方案总结
Oct 26 PHP
Redis构建分布式锁
Mar 28 PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
PHP实现简单登录界面
Oct 23 PHP
php获取后台Job管理的实现代码
Jun 10 #PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 #PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
Jun 10 #PHP
PHP网站备份程序代码分享
Jun 10 #PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 #PHP
PHP中遍历stdclass object的实现代码
Jun 09 #PHP
IIS7.X配置PHP运行环境小结
Jun 09 #PHP
You might like
php GeoIP的使用教程
2011/03/09 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
python基础教程之循环介绍
2014/08/29 Python
python绘制条形图方法代码详解
2017/12/19 Python
对python的文件内注释 help注释方法
2018/05/23 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
简单了解python变量的作用域
2019/07/30 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
django中瀑布流写法实例代码
2019/10/14 Python
python中bytes和str类型的区别
2019/10/21 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
机电职业生涯规划书范文
2014/03/08 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
工程项目经理任命书
2014/06/05 职场文书
学校班班通实施方案
2014/06/11 职场文书
2015年见习期工作总结
2014/12/12 职场文书
靠谱的活动总结
2019/04/16 职场文书