这货是从 martin 大神的《企业应用架构模式》中学到的,辅助 php 动态语言的特性,可以比 java 轻松很多的实现延迟加载(lazyload)。基本原理是通过一个虚代理(virtual proxy)做占位符,一旦访问代理对象的某成员(方法或属性),加载就被触发。
不过我实现的这个版本有局限性:
只适用于对象,无法代理数组等基本数据类型(需要用 arrayobject 一类的内置对象封装)
被代理之后,一些带有操作符重载性质的接口实现就失效了,例如 arrayaccess 的索引器、itreator 的迭代器,如果是用该代理来处理集合类型的延迟加载,还需要继承一个子类做特殊处理,以便外部用 foreach 迭代
demo
复制代码 代码如下:
// 测试
$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);
virtual proxy
复制代码 代码如下:
/**
* 虚代理,只有在被访问成员时才调用闭包函数生成目标对象。
*
* @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();
}
}
}
0
0
相关文章
如何在 WordPress Astra 主题页眉中动态显示带图标的特色图像标题
PHP 中合并多个学生成绩数组并去重(以 student_id 为唯一标识)
PHP 文件元数据提取:基于 PHPDoc 注释的标准实践
PHP 中合并多个学生成绩数组并去重(按 student_id 合并)
PHP 中高效读取 PHP 文件顶部注释元数据的实践方案
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。
63
2026.02.04
本专题详细汇总了学习通网页版入口与登录方法,提供学习通官方网页端入口、学生登录平台、网页版使用指南等内容,帮助用户快速稳定地登录学习通官网,顺利进入学习平台,提升学习效率和体验。
9
2026.02.04
本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。
9
2026.02.04
本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。
3
2026.02.04
本专题深入讲解 Golang 应用的容器化与 Docker 部署,涵盖 Docker 基础概念、容器构建与镜像管理、Go 应用的 Dockerfile 编写、跨平台容器部署与优化、Docker Compose 和 Kubernetes 部署工具。通过实际案例,帮助学习者掌握 如何将 Golang 应用容器化并实现高效部署与管理,提升系统的可扩展性与运维效率。
3
2026.02.04
热门下载
相关下载
精品课程
最新文章





