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
浅谈PHP与C#的值类型指向区别的详解
May 21 PHP
PHP中if和or运行效率对比
Dec 12 PHP
php+mysqli使用预处理技术进行数据库查询的方法
Jan 28 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
简单了解PHP编程中数组的指针的使用
Nov 30 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
js setTimeout 常见问题小结
2013/08/13 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
Python中os.path用法分析
2015/01/15 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
python清空命令行方式
2020/01/13 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
财务经理岗位职责
2013/11/09 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
食品安全责任书
2014/04/15 职场文书
文案策划专业自荐信
2014/07/07 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书
高中生军训感言
2015/08/01 职场文书
python运行脚本文件的三种方法实例
2022/06/25 Python