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

Tags: PHP虚代理 PHP延迟加载

分享到: