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

《:PHP中使用虚代理实现延迟加载技术》要点:
本文介绍了:PHP中使用虚代理实现延迟加载技术,希望对您有用。如果有疑问,可以联系我们。

话说这货是从 Martin 大神的《企业应用架构模式》中学到的,辅助 PHP 动态语言的特性,可以比 Java 轻松很多的实现延迟加载――通过一个虚代理占位符.唯一的缺陷,是只能代理对象,不能代理内置基本类型.PHP编程

我试水的 PHP 领域模型设计中,也是用这个来实现 DomainObject 的延迟加载.PHP编程

代码如下:

 * 虚代理,只有在被拜访成员时才调用闭包函数生成目标对象.
 *
 * @author tonyseek
 *
 */
class VirtualProxy
{
    private $holder = null;
    private $loader = null;

    /**
     * 虚代理,只有在被拜访成员时才调用闭包函数生成目标对象.
     *
     * @param Closure $loader 生成被代理对象的闭包函数
     */
    public function __construct(Closure $loader)
    {
            $this->loader = $loader;
    }PHP编程

    /**
     * 代理成员方法调用
     *
     * @param string $method
     * @param array  $arguments
     * @throws BadMethodCallException
     * @return mixed
     */
    public function __call($method,array $arguments = null)
    {
            $this->check();PHP编程

            if (!method_exists($this->holder,$method)) {
                    throw new BadMethodCallException();
            }PHP编程

            return call_user_func_array(
                    array(&$this->holder,$method),
                    $arguments);
    }PHP编程

    /**
     * 代理成员属性的读取
     *
     * @param string $property
     * @throws ErrorException
     * @return mixed
     */
    public function __get($property)
    {
            $this->check();PHP编程

            if (!isset($this->holder->$property)) {
                    throw new ErrorException();
            }PHP编程

            return $this->holder->$property;
    }PHP编程

    /**
     * 代理成员属性的赋值
     *
     * @param string $property
     * @param mixed  $value
     */
    public function __set($property,$value)
    {
            $this->check();PHP编程

            $this->holder->$property = $value;
    }PHP编程

    /**
     * 检查是否已经存在被代理对象,不存在则生成.
     */
    private function check()
    {
            if (null == $this->holder) {
                    $loader = $this->loader;
                    $this->holder = $loader();
            }
    }
}PHP编程


// 测试
$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中使用虚代理实现延迟加载技术》讨论,分享您的想法,编程之家 jb51.cc为您提供专业教程。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...