PHP自定义Collection类实现对象延迟加载

温以宁
温以宁
发布时间:2026-10-14 | 6人浏览过
原创

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 高级用法与设计模式 的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表