当前位置: 首页 > 编程笔记 >

PHP中使用虚代理实现延迟加载技术

仲孙奇
2023-03-14
本文向大家介绍PHP中使用虚代理实现延迟加载技术,包括了PHP中使用虚代理实现延迟加载技术的使用技巧和注意事项,需要的朋友参考一下

话说这货是从 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);

 类似资料:
  • 本文向大家介绍AngularJS使用ocLazyLoad实现js延迟加载,包括了AngularJS使用ocLazyLoad实现js延迟加载的使用技巧和注意事项,需要的朋友参考一下 最近开发一个系统遇到了一个问题,用angular路由一个html片段,该片段需要使用一个js插件来实现一个富文本编辑器。关键问题在于必须要在片段加载后通过js与dom元素进行绑定。一开始想当然以为直接把js代码写在代码段

  • 本文向大家介绍使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理),包括了使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)的使用技巧和注意事项,需要的朋友参考一下 图片延迟加载也称懒加载,通常应用于图片比较多的网页,如果一个页面图片比较多,且页面高度或宽度有好几屏,页面初次加载时,只显示可视区域的图片,当页面滚动的时候,图片进入了可视区域再进行加载,这样可以显著的提高页

  • 本文向大家介绍AngularJS中的Directive实现延迟加载,包括了AngularJS中的Directive实现延迟加载的使用技巧和注意事项,需要的朋友参考一下 所谓的延迟加载通常是:直到用户交互时才加载。如何实现延迟加载呢? 需要搞清楚三个方面: 1、html元素的哪个属性需要延迟加载? 2、需要对数据源的哪个字段进行延迟加载? 3、通过什么事件来触发延迟加载? 自定义的Directive

  • 本文向大家介绍Webpack 实现 AngularJS 的延迟加载,包括了Webpack 实现 AngularJS 的延迟加载的使用技巧和注意事项,需要的朋友参考一下 随着你的单页应用扩大,其下载时间也越来越长。这对提高用户体验不会有好处(提示:但用户体验正是我们开发单页应用的原因)。更多的代码意味着更大的文件,直到代码压缩已经不能满足你的需求,你唯一能为你的用户做的就是不要再让他一次性下载整个应

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 我正在尝试实现一个客户端站点的延迟加载wordpress插件,该插件是“BJ延迟加载”,客户端使用的主题是“取景器”。 主页上有2400个120x120的缩略图,它们都是帖子,缩略图是帖子的附件,全尺寸图像(点击时加载)是帖子的特色图像(例如,请参见取景器页面上的图像) 我安装了插件,但默认情况下,这只会延迟加载帖子内容中的图像,而这些内容不是。在“其他说明”中,开发人员要求通过过滤器传递以下内容