当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP中使用虚代理实现延迟加载技术

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-24 13:42:11 浏览: 评论:0 

这篇文章主要介绍了PHP中使用虚代理实现延迟加载技术,延迟加载是一种领域模型设计一种架构模式,需要的朋友可以参考下

话说这货是从 Martin 大神的《企业应用架构模式》中学到的,辅助 PHP 动态语言的特性,可以比 Java 轻松很多的实现延迟加载——通过一个虚代理占位符。唯一的缺陷,是只能代理对象,不能代理内置基本类型。

我试水的 PHP 领域模型设计中,也是用这个来实现 DomainObject 的延迟加载。

代码如下:

  1.  * 虚代理,只有在被访问成员时才调用闭包函数生成目标对象。 
  2.  * 
  3.  * @author tonyseek 
  4.  * 
  5.  */ 
  6. class VirtualProxy 
  7.     private $holder = null; 
  8.     private $loader = null; 
  9.     /** 
  10.      * 虚代理,只有在被访问成员时才调用闭包函数生成目标对象。 
  11.      * 
  12.      * @param Closure $loader 生成被代理对象的闭包函数 
  13.      */ 
  14.     public function __construct(Closure $loader
  15.     { 
  16.             $this->loader = $loader
  17.     } 
  18.  
  19.     /** 
  20.      * 代理成员方法的调用 
  21.      * 
  22.      * @param string $method 
  23.      * @param array  $arguments 
  24.      * @throws BadMethodCallException 
  25.      * @return mixed 
  26.      */ 
  27.     public function __call($methodarray $arguments = null) 
  28.     { 
  29.             $this->check(); 
  30.  
  31.             if (!method_exists($this->holder, $method)) { 
  32.                     throw new BadMethodCallException(); 
  33.             } 
  34.  
  35.             return call_user_func_array( 
  36.                     array(&$this->holder, $method), 
  37.                     $arguments); 
  38.     } 
  39.  
  40.     /** 
  41.      * 代理成员属性的读取 
  42.      * 
  43.      * @param string $property 
  44.      * @throws ErrorException 
  45.      * @return mixed 
  46.      */ 
  47.     public function __get($property
  48.     { 
  49.             $this->check(); 
  50.  
  51.             if (!isset($this->holder->$property)) { 
  52.                     throw new ErrorException(); 
  53.             } 
  54.  
  55.             return $this->holder->$property
  56.     } 
  57.  
  58.     /** 
  59.      * 代理成员属性的赋值 
  60.      * 
  61.      * @param string $property 
  62.      * @param mixed  $value 
  63.      */ 
  64.     public function __set($property$value
  65.     { 
  66.             $this->check(); 
  67.  
  68.             $this->holder->$property = $value
  69.     } 
  70.  
  71.     /** 
  72.      * 检查是否已经存在被代理对象,不存在则生成。 
  73.      */ 
  74.     private function check() 
  75.     { 
  76.             if (null == $this->holder) { 
  77.                     $loader = $this->loader; 
  78.                     $this->holder = $loader(); 
  79.             } 
  80.     } 
  81.  
  82.  
  83. // 测试 
  84. $v = new VirtualProxy(function(){ 
  85.         echo 'Now, Loading'"\n"
  86.     $a = new ArrayObject(range(1,100)); 
  87.     $a->abc = 'a'
  88.         // 实际使用中,这里调用的是 DataMapper 的 findXXX 方法 
  89.         // 返回的是领域对象集合 
  90.     return $a
  91. });//www.phpfensi.com 
  92. // 代理对象直接当作原对象访问 
  93. // 而此时构造方法传入的 callback 函数才被调用 
  94. // 从而实现加载对象操作的延迟 
  95. echo $v->abc . $v->offsetGet(50); 

Tags: PHP虚代理 PHP延迟加载

分享到: