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