SplFixedArray 是 SPL 提供的**固定長度、整數鍵**陣列實作,底層為 C 陣列,記憶體緊湊、存取速度快,是大量數值型資料處理的利器。
<?php
ini_set('memory_limit', '128M');
for ($size = 10000; $size < 10000000; $size *= 4) {
echo "Testing size: $size\n";
$s = microtime(true);
$arr = [];
for ($i = 0; $i < $size; $i++) $arr[$i] = null;
echo "Array(): " . (microtime(true) - $s) . "s\n";
$s = microtime(true);
$sfa = new SplFixedArray($size);
for ($i = 0; $i < $size; $i++) $sfa[$i] = null;
echo "SplFixedArray(): " . (microtime(true) - $s) . "s\n";
}
典型結果:
Testing size: 10000 Array(): 0.0040s SplFixedArray(): 0.0020s Testing size: 2560000 Array(): 0.7570s SplFixedArray(): 0.6730s
結論:建構與寫入速度快 **20%~30%**,記憶體佔用約 **1/3 ~ 1/2**(無雜湊表開銷)。
| 方法 | 說明 |
|---|---|
__construct(int $size = 0) | 建立指定長度陣列 |
setSize(int $size) | 動態調整長度(擴增補 null,縮減截斷) |
getSize() | 取得當前長度 |
offsetSet/Get/Exists/Unset | ArrayAccess 介面,支援 $arr[3] = 'x' |
current/key/next/rewind/valid | Iterator 介面,支援 foreach |
count() | Countable 介面,等同 getSize() |
toArray() | 轉為標準陣列 |
fromArray(array, $save_indexes=true) | 靜態工廠,從陣列建立 |
<?php
$arr = new SplFixedArray(4);
$arr[0] = 'php';
$arr[1] = 1;
$arr[3] = 'python'; // 索引 2 為 null
foreach ($arr as $v) {
echo $v . PHP_EOL; // php, 1, , python
}
echo $arr->getSize(); // 4
$arr->setSize(5);
$arr[4] = 'new one';
// 越界存取拋 RuntimeException
try {
echo $arr[10];
} catch (RuntimeException $e) {
echo "Out of bounds: " . $e->getMessage();
}
[] 擴容機制更靈活ArrayObjectPHP 8 JIT 對 SplFixedArray 的 C 級迴圈優化極佳,數值運算迴圈速度可逼近 C 擴展,適合科學計算、遊戲邏輯、訊號處理等高效能場景。