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 相关文章推荐
WINDOWS 2000下使用ISAPI方式安装PHP
Sep 05 PHP
PHP脚本的10个技巧(7)
Oct 09 PHP
一个图形显示IP的PHP程序代码
Oct 19 PHP
php错误、异常处理机制(补充)
May 07 PHP
ueditor 1.2.6 使用方法说明
Jul 24 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
PHP内核探索之解释器的执行过程
Dec 22 PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 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怎样调用MSSQL的存储过程
2006/10/09 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
PHP钩子实现方法解析
2019/05/21 PHP
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
浅析Python中yield关键词的作用与用法
2016/11/29 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
Python如何实现定时器功能
2020/05/28 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
python中time tzset()函数实例用法
2021/02/18 Python
.net软件工程师应聘上机试题
2015/03/10 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
2013英文求职信模板范文
2013/11/15 职场文书
工作经历证明书范文
2014/11/02 职场文书
经销商会议开幕词
2016/03/04 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
python 远程执行命令的详细代码
2022/02/15 Python
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers
vue递归实现树形组件
2022/07/15 Vue.js