• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-01) 37次浏览 已收录 0个评论

这篇文章主要介绍了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();
            }
    }
}

// 测试
来源gao.dai.ma.com搞@代*码网 $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中使用虚代理实现延迟加载技术的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP中使用虚代理实现延迟加载技术

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址