这货是从 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->offtget(50);
virtual proxy
复制代码 代码如下:
/**
* 虚代理,只有在被访问成员时才调用闭包函数生成目标对象。
*
* @author tonhour前面用a还是anyek
*
*/
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
* @thr醉花荫ows badmethodcallexception
* @return mixed
*/
public function __call($method, array $argumen方面的英语ts = null)
{
$this->check();
if (!method_exists($this->holder, $method)) {
throw new badmethodcallexception();
}
return call_ur_func_array(
array(&$this->holder, $method),
$arguments);
}
/**
* 代理成员属性的读取
*
* @param string $property
* @throws errorexception
* @return mixed
*/
public function __get($property)
{
$this->check();
if (!ist($this->holder->$property)) {
throw new errorexception();
}
return $this->holder->$property;
}
/**
* 代理成员属性的赋值
*
* @param string $齐刘海图片property
* @param mixed $value
*/
public function __t($property, $value)
{
$this->check();
$this->holder->$property = $value;
}
/**
* 检查是否已经存在被代理对象,不存在则生成。
*/
private function check()
{
if (null == $this->holder) {
$loader = $this->loader;
$this->holder = $loader();
}
}
}
本文发布于:2023-04-06 13:00:06,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/4bc71f64e39d76a7bfe1ae6fe99f4db7.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:php中通过虚代理实现延迟加载的实现代码.doc
本文 PDF 下载地址:php中通过虚代理实现延迟加载的实现代码.pdf
留言与评论(共有 0 条评论) |