zoukankan      html  css  js  c++  java
  • 【碎片】PHP 虚代理实现延迟加载

    简介:这是【碎片】PHP 虚代理实现延迟加载的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=337757' scrolling='no'>

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

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

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

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/337757.html pageNo:9
  • 相关阅读:
    12月11日
    081212 晴
    12月10日
    树莓派项目——基于树莓派的WIFI网络互传系统设计
    IDE
    边缘检测
    Android Launcher桌面应用快捷方式的开发
    android ui事件处理分析
    listview 分析
    ApplicationsIntentReceiver.class
  • 原文地址:https://www.cnblogs.com/ooooo/p/2247009.html
Copyright © 2011-2022 走看看