首页 > 作文

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

更新时间:2023-04-06 13:00:08 阅读: 评论:0

这货是从 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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图