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 相关文章推荐
PHP数据类型之整数类型、浮点数的介绍
Apr 28 PHP
linux实现php定时执行cron任务详解
Dec 24 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
php中chdir()函数用法实例
Nov 13 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
php中文语义分析实现方法示例
Sep 28 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 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
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
js 上传图片预览问题
2010/12/06 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
JavaScript SHA512&SHA256加密算法详解
2015/08/11 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
Python Requests安装与简单运用
2016/04/07 Python
python与C互相调用的方法详解
2017/07/14 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python 公共方法汇总解析
2019/09/16 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
python中线程和进程有何区别
2020/06/17 Python
python中数字是否为可变类型
2020/07/08 Python
django创建css文件夹的具体方法
2020/07/31 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
数学系个人求职信范文
2014/01/30 职场文书
煤矿安全生产标语
2014/06/06 职场文书
保护校园环境倡议书
2015/04/28 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python