在等待原生支援型別陣列的同時,以下提供幾種替代方法,可以透過巧妙運用可變參數函式來確保陣列的強型別。這些方法的效能對作者來說是個謎,因此基準測試的責任落在讀者身上。
PHP 5.6 新增了展開運算子 (...),用於將陣列解包以作為函式參數。PHP 7.0 新增了純量型別提示。後續版本的 PHP further 改善了型別系統。有了這些新增和改進,就可以對型別陣列提供良好的支援。
<?php
declare (strict_types=1);
function typeArrayNullInt(?int ...$arg): void {
}
function doSomething(array $ints): void {
(function (?int ...$arg) {})(...$ints);
(fn (?int ...$arg) => $arg)(...$ints);
typeArrayNullInt(...$ints);
}
function doSomethingElse(?int ...$ints): void {
}
$ints = [1,2,3,4,null];
doSomething ($ints);
doSomethingElse (...$ints);
?>
兩種方法都適用於所有類型宣告。這裡的關鍵思想是讓函式在遇到類型違規時拋出運行時錯誤。`doSomethingElse` 中使用的類型化方法比較簡潔,但它不允許在可變參數之後有任何其他參數。它還要求呼叫端知道這個類型化實現並解包陣列。`doSomething` 中使用的方法比較雜亂,但它不需要呼叫端知道類型化方法,因為解包是在函式內部執行的。它也比較不容易引起歧義,因為 `doSomethingElse` 也會接受 n 個單獨的參數,而 `doSomething` 只接受一個陣列。如果 PHP jemals 原生支援類型化陣列,`doSomething` 的方法也更容易移除。這兩種方法都只適用於輸入參數。陣列返回值類型檢查需要在呼叫端進行。
如果未啟用 `strict_types`,可能需要從類型檢查函式返回強制轉換的純量值(例如,浮點數和字串變為整數)以確保正確的類型。