普通 PHP 陣列是有序映射(HashTable),記憶體開銷大、擴容複製慢。SplFixedArray 以 C 級連續記憶體儲存,僅支援整數鍵、固定長度,讀寫效能提升 20%-30%,記憶體減少 50%+,適合大數據量、高頻讀寫場景。
ini_set('memory_limit', '128M');
for ($size = 10000; $size < 2600000; $size *= 4) {
echo "\nSize: $size\n";
$t = microtime(true); $a = []; for ($i=0;$i<$size;$i++) $a[$i]=null; echo "Array: " . (microtime(true)-$t) . "s\n";
$t = microtime(true); $b = new SplFixedArray($size); for ($i=0;$i<$size;$i++) $b[$i]=null; echo "SplFixedArray: " . (microtime(true)-$t) . "s\n";
}
/*
Size: 10000 Array: 0.004s SplFixedArray: 0.002s
Size: 640000 Array: 0.20s SplFixedArray: 0.17s
Size: 2560000 Array: 0.76s SplFixedArray: 0.67s
*/
| 方法 | 說明 |
|---|---|
| __construct($size) | 創建指定長度陣列 (預設 0) |
| setSize($size) | 動態調整長度 (擴容保留數據,縮容截斷) |
| getSize() | 獲取當前長度 |
| offsetGet/Set/Unset/Exists | 隨機存取 (ArrayAccess) |
| toArray() | 轉為普通陣列 |
| fromArray($arr, $saveKeys) | 靜態工廠:從陣列創建 |
| count()/iterator | Countable/Iterator 介面 |
$arr = new SplFixedArray(4);
$arr[0] = 'php';
$arr[1] = 1;
$arr[3] = 'python'; // 索引 2 為 null
foreach ($arr as $v) echo "$v "; // php 1 python
echo "長度: {$arr->getSize()}\n"; // 4
$arr->setSize(5);
$arr[4] = 'new';
// 越界拋出 RuntimeException
try { echo $arr[10]; } catch (RuntimeException $e) { echo "越界: {$e->getMessage()}\n"; }
array_map/filter/reduce 等高階函數 (需先 toArray())