PHP自定义Collection类实现对象延迟加载
PHP原生仅提供数组结构,本文介绍如何基于数组封装独立的 Collection 集合类,并提供支持延迟加载(Lazy Loading)的设计方案,解决复杂对象按需实例化的问题。
基础 Collection 类的封装原理
为了在 PHP 中获得类似其他语言的集合操作体验,可以通过私有数组变量包装并提供规范的方法。核心逻辑包含:通过 addItem 进行带键或无键添加、removeItem 按索引删除、getItem 检索以及 Keys 获取所有键名。
第1步:定义基础 Collection 类结构
目的:建立具备基本增删查功能的容器,并预设异常处理逻辑以确保数据安全性。
关键动作与参数:
- 使用
private $_members = array()存储实体。 - 在设置元素时校验
$key是否重复,避免覆盖已有数据。 - 提供
legth(原文拼写如此,指代长度) 和exists辅助方法供外部状态检查。
进阶:引入延迟加载(Lazy Loading)机制
在ORM框架或大型应用中,通常期望在访问某个关联集合(如学生的课程列表)时,才真正去执行数据库查询。这需要将 Collection 改造为具有“惰性”特质的类。
第2步:实现延迟加载回调接口
入口与参数:扩展 setLoadCallback 方法接收回调函数,并增加私有标志位 _isLoaded。
核心逻辑:
- 在每一次集合读写操作前插入
_checkCallback检查。 - 若
_onload已注册且_isLoaded为假,则首次调用传入的回调函数(通常为静态方法或绑定对象),完成实际的数据填充后再标记为已加载。
第3步:编写 Student 与 Course 测试用例
以下代码演示了如何通过继承 Collection 形成 CourseCollection,并在 Student 构造器中挂载课程集合与对应的回调方法。
class CourseCollection extends Collection {
public function addItem(Course $obj,$key=null) {
parent::addItem($obj,$key);
}
}
class Student{
private $_id;
private $_name;
public $course;
public function __construct($id,$name) {
$this->_id=$id;
$this->_name=$name;
$this->course=new CourseCollection();
// 指定当对 course 进行任何操作时,触发 loadCourses 方法
$this->course->setLoadCallback('loadCourses',$this);
}
// 这里的模拟逻辑可替换为真实的DB查询
public function loadCourses(Collection $col) {
$col->addItem(new Course(1, "001", "语文"),1);
$col->addItem(new Course(2, "002", "数学"),2);
}
}
总结
上述实现展示了如何利用 PHP 的闭包和回调特性,在不依赖第三方 ORM 的情况下,为集合类赋予延迟加载能力。该模式适用于需要优化首屏性能或减少非必要资源消耗的项目场景。 以上就是 PHP自定义Collection类实现对象延迟加载 的详细内容,更多关于 PHP 高级用法与设计模式 的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









