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编程网上资源导航
Oct 09 PHP
用PHP+java实现自动新闻滚动窗口
Oct 09 PHP
文件上传程序的全部源码
Oct 09 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
php中的curl使用入门教程和常见用法实例
Apr 10 PHP
php获取发送给用户的header信息的方法
Mar 16 PHP
php获取json数据所有的节点路径
May 17 PHP
WordPress中创建用户角色的相关PHP函数使用详解
Dec 25 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
详解php协程知识点
Sep 21 PHP
php两点地理坐标距离的计算方法
Dec 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
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP5.2下preg_replace函数的问题
2015/05/08 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
超简单的jquery的AJAX用法
2010/05/10 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
大学生毕业自我鉴定范文
2013/11/03 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
党员干部承诺书范文
2014/03/25 职场文书
地球一小时宣传标语
2014/06/24 职场文书
2015年电教工作总结
2015/05/26 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python