
PHP 8.1 中 SplFixedArray 在密集数字索引场景下,相比普通数组有明确的内存优势,核心在于它绕开了 PHP 数组底层的哈希表结构。
内存结构差异决定开销大小
普通 PHP 数组本质是有序哈希表(ordered hash table),每个元素都需存储键、值、哈希值、指针等元信息。即使你只用整数索引(如 $arr[0], $arr[1], ...),引擎仍按哈希逻辑管理,带来固定额外开销。
SplFixedArray 则不同:它在初始化时(new SplFixedArray(10000))就分配一块连续、定长的内存块,类似 C 语言的原生数组。元素直接按偏移量存放,不存键名、不维护哈希链、不预留扩容空间。
- 10 万个整数元素的普通数组,实测内存占用约 12–15 MB
- 同等规模的
SplFixedArray,通常仅占 4–6 MB(取决于元素类型) - 节省幅度普遍达 50%–60%,数据越密集、越纯整数索引,优势越明显
适用前提很关键
这种优势不是无条件的,必须满足三个条件:
立即学习“PHP免费学习笔记(深入)”;
- 索引全部为非负整数,且范围集中(如 0 到 N−1 或接近连续)
- 数组长度在创建前已知,不频繁变动;
setsize()是手动操作,非自动扩容 - 写入以随机位置赋值为主(
$arr[5000] = $val),而非追加($arr[] = $val不支持)
一旦混用字符串键、频繁 resize、或大量空洞索引(如只用 [0] 和 [99999]),SplFixedArray 的优势会迅速削弱甚至反超普通数组。
PHP 8.1 带来的实际改进
相比早期版本,PHP 8.1 对 SplFixedArray 的优化体现在运行时效率与兼容性上:
-
count()和遍历(foreach)性能进一步提升,内部迭代器实现更轻量 - 完整支持
JsonSerializable,json_encode($arr)可直接输出标准 JSON 数组,无需先调toArray() - 序列化/反序列化更可靠,新增
__serialize()和__unserialize()魔术方法
这些改进不直接减少内存,但让密集索引场景下的整体使用更顺畅、更少隐式转换带来的临时内存开销。
它不是万能替代品,但在图像像素处理、ID 批量缓存、预计算结果集这类“长度固定、索引致密、读远多于写”的场景里,内存省得实在,访问也更快。



















