• 技术文章 >后端开发 >php教程

    0x0000008e电脑蓝屏代码 php中通过虚代理实现延迟加载的实现代码

    2016-07-29 08:45:37原创922
    这货是从 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();
    }
    }
    }

    以上就介绍了0x0000008e电脑蓝屏代码 php中通过虚代理实现延迟加载的实现代码,包括了0x0000008e电脑蓝屏代码方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:memcache 批量获取memcache值并按key的顺序返回的实现代码 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 递归验证用户输入有关问题• 请教php有做成像grid样式的方法吗• 关于exec函数的返回值有关问题 • 学习PHP中,想了解上怎么制作一个完整项目的,从最初构思到框架搭建,到程序编写,有这方面的书籍或者视频吗 • 怎么让上拉列表显示半小时的数据
    1/1

    PHP中文网