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开发中四种查询返回结果分析
Jan 02 PHP
PHP批量采集下载美女图片的实现代码
Jun 03 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
php读取文件内容的方法汇总
Jan 24 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
php中动态调用函数的方法
Mar 16 PHP
php实现短信发送代码
Jul 05 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
php的lavarel框架中join和orWhere的用法
Dec 28 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时间格式控制符对照表分享
2013/07/23 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
jQuery Ajax文件上传(php)
2009/06/16 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
vue+iview动态渲染表格详解
2019/03/19 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
Python 正则表达式(转义问题)
2014/12/15 Python
在Python中操作字典之clear()方法的使用
2015/05/21 Python
python编码最佳实践之总结
2016/02/14 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
django 发送手机验证码的示例代码
2018/04/25 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
预备党员思想汇报范文
2014/01/11 职场文书
电气个人求职信范文
2014/02/04 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
医学求职自荐信
2014/06/21 职场文书
2015年工会工作总结
2015/03/30 职场文书
物业保洁员管理制度
2015/08/05 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS