ThinkPHP 6 的 Collection 不再继承 ArrayAccess,需用 get()、toArray() 等方法替代数组访问,链式调用仍支持;TP5.1 兼容数组语法但缺 reduce/partition;JSON 序列化需显式 toArray() 或 toJson();TP6.3+ 的 lazy 模式仅对 Generator 有效。

ThinkPHP 6 的 Collection 不再继承 ArrayAccess,但支持链式调用
TP6 把 Collection 从框架核心剥离为独立组件(topthink/think-collection),默认不再实现 ArrayAccess、IteratorAggregate 等接口。这意味着你不能直接用 $collection['key'] 或 foreach ($collection as $v)——会报 Fatal error: Cannot use object of type think\Collection as array。
正确做法是显式调用方法:
-
$collection->get('key')替代$collection['key'] -
$collection->toArray()后再foreach,或直接用$collection->each(...) - 链式操作如
$collection->filter(...)->map(...)->values()依然可用,且返回新Collection
TP5.1 的 Collection 支持数组式访问,但不支持 reduce 和 partition
TP5.1 的 Collection 是基于 ArrayObject 封装的,天然兼容数组语法:$collection[0]、isset($collection['id']) 都能用。但它缺少 TP6 中新增的高阶方法。
常见误用场景:在 TP5.1 里写 $collection->reduce(...),会抛出 Call to undefined method think\Collection::reduce()。
立即学习“PHP免费学习笔记(深入)”;
- 替代方案:用
$collection->sum()、$collection->avg()等已有聚合方法 - 自定义聚合逻辑请用
$collection->each()+ 外部变量累加 - 需要分组筛选时,
$collection->filter()->chunk(2)比硬写partition更稳妥
从 TP5.1 升级到 TP6 时,Collection 的 JSON 序列化行为变了
TP5.1 中 json_encode($collection) 默认触发 toArray(),结果是纯数组;TP6 默认调用 __toString()(返回空字符串)或抛异常,实际输出可能是 {} 或 null,极易导致前端解析失败。
必须显式处理:
- 返回 JSON 前统一加
->toArray():return json($collection->toArray()); - 若需保留对象结构(比如带元数据),改用
->toJson()方法(TP6 新增) - 注意:TP6 的
toJson()默认不格式化,加参数JSON_PRETTY_PRINT才可读
TP6.3+ 的 Collection 支持 lazy 模式,但只对生成器有效
TP6.3 引入了 Collection::makeLazy(),用于包裹 Generator 实现内存友好型大数据处理。但它对普通数组无效——传入 range(1, 100000) 再调 makeLazy(),不会变懒,仍会全量加载。
真正起效的前提只有一个:
- 数据源本身是
Generator,比如function() { for ($i = 0; $i -
makeLazy()后的方法链(如filter、map)才真正延迟执行 - 一旦调用
->all()、->toArray()或遍历,整个流水线立刻求值
别指望它优化普通数组循环——那只是多套了一层对象壳。



















