在等待对类型化数组的原生支持时,这里有一些替代方法,可以通过滥用可变参数函数来确保数组的强类型。这些方法的性能对编写者来说是一个谜,因此对其进行基准测试的责任落在了读者身上。
PHP 5.6 添加了 splat 运算符 (...),用于解包用作函数参数的数组。PHP 7.0 添加了标量类型提示。更高版本的 PHP 进一步改进了类型系统。通过这些添加和改进,可以对类型化数组提供不错的支持。
<?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 以后添加了原生类型化数组支持,`doSomething` 的方法也更容易去除。这两种方法只适用于输入参数。数组返回值类型检查需要在调用站点进行。
如果未启用 `strict_types`,则可能需要从类型检查函数返回强制转换的标量值(例如,浮点数和字符串变为整数),以确保正确的类型。