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 相关文章推荐
模拟OICQ的实现思路和核心程序(二)
Oct 09 PHP
织梦模板标记简介
Mar 11 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 PHP
PHP加密函数 Javascript/Js 解密函数
Sep 23 PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 PHP
PHP图形操作之Jpgraph学习笔记
Dec 25 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
Jun 10 PHP
解决Laravel 不能创建 migration 的问题
Oct 09 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
基于mysql的论坛(4)
2006/10/09 PHP
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
Vue 设置axios请求格式为form-data的操作步骤
2019/10/29 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
python实现关键词提取的示例讲解
2018/04/28 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
基于python实现计算两组数据P值
2020/07/10 Python
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
大学新生欢迎词
2014/01/10 职场文书
学校师德师风整改方案
2014/10/28 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
Python绘制散乱的点构成的图的方法
2022/04/21 Python