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 相关文章推荐
一个多文件上传的例子(原创)
Oct 09 PHP
PHP4实际应用经验篇(8)
Oct 09 PHP
php 防止单引号,双引号在接受页面转义
Jul 10 PHP
PHP的5个安全措施小结
Jul 17 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
PHP工程师VIM配置分享
Dec 15 PHP
php表单处理操作
Nov 16 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
PHP实现微信退款功能
Oct 02 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
用PHP的ob_start();控制您的浏览器cache!
2006/11/25 PHP
smarty中post用法实例
2014/11/28 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
python自动化测试之连接几组测试包实例
2014/09/28 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
django中media媒体路径设置的步骤
2019/11/15 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
python动态文本进度条的实例代码
2020/01/22 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
大学生文员专业个人求职信范文
2014/01/05 职场文书
上班离岗检讨书
2014/01/27 职场文书
质检部经理岗位职责
2014/02/19 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL