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

高洛峰
发布: 2016-11-30 10:21:20
原创
1130人浏览过

这货是从 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
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号