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


Posted in PHP onNovember 05, 2014

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

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

 * 虚代理,只有在被访问成员时才调用闭包函数生成目标对象。

 *

 * @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();

            }

    }

}


// 测试

$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);
PHP 相关文章推荐
NT IIS下用ODBC连接数据库
Oct 09 PHP
PHP 开发环境配置(Zend Studio)
Apr 28 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
php获取数组元素中头一个数组元素值的实现方法
Dec 20 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
php防止网站被攻击的应急代码
Oct 21 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
PHP打印输出函数汇总
Aug 28 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
PHP实现获取域名的方法小结
Nov 05 #PHP
php调用shell的方法
Nov 05 #PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
Nov 05 #PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
Nov 05 #PHP
phpnow php探针环境检测代码
Nov 04 #PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
Nov 04 #PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
Nov 04 #PHP
You might like
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
Javascript将string类型转换int类型
2010/12/09 Javascript
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
js格式化时间的方法
2015/12/18 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
基本DOM节点操作
2017/01/17 Javascript
vuejs指令详解
2017/02/07 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
Python 连连看连接算法
2008/11/22 Python
Python中的zipfile模块使用详解
2015/06/25 Python
Python随机读取文件实现实例
2017/05/25 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
python for和else语句趣谈
2019/07/02 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
python代码xml转txt实例
2020/03/10 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
酒店办公室文员岗位职责
2013/12/18 职场文书
汽车转让协议书范本
2014/12/07 职场文书
党小组意见范文
2015/06/08 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android