gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章php中通过虚代理实现延迟加载的实现代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

这货是从 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中通过虚代理实现延迟加载的实现代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com