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 相关文章推荐
win2003服务器使用WPS的COM组件的一些问题解决方法
Jan 11 PHP
深入php多态的实现详解
Jun 09 PHP
使用PHP导出Word文档的原理和实例
Oct 21 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
Ubuntu12下编译安装PHP5.3开发环境
Mar 27 PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
Feb 20 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
Mar 31 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
Apr 09 PHP
YII框架页面缓存操作示例
Apr 29 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
解析php中memcache的应用
2013/06/18 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
JS与框架页的操作代码
2010/01/17 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
python实现在windows下操作word的方法
2015/04/28 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
网站客服岗位职责
2014/04/05 职场文书
买房协议书
2014/04/11 职场文书
教师求职信范文
2014/05/24 职场文书
消防标语大全
2014/06/07 职场文书
民主生活会剖析材料
2014/09/30 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
详解MongoDB的条件查询和排序
2021/06/23 MongoDB
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL