PHP 可遍历类型提示

2022-08-30 20:55:57

我有一个相对简单的函数,它使用foreach

function foo($t) {
     $result;
     foreach($t as $val) {
         $result = dosomething($result, $val);
     }
     return $result;
}

我想键入提示,而可遍历似乎是我需要的确切类型提示

 function foo(Traversable $t) {

然而,这给出了一个当使用数组时(当然可以在一个中使用):示例E_RECOVERABLE_ERRORforeach

 Argument 1 passed to foo() must implement interface Traversable, array given

有没有办法键入提示,或者这是不可能的?


答案 1

PHP 7.1 为此引入了可迭代类型声明,它接受 的数组和实例。\Traversable

在以前的版本中,必须省略类型声明。


答案 2

有一个关于这个的错误:#41942。作为“不是错误”关闭。由于PHP数组不是对象,因此它们无法实现接口,因此无法同时键入athin和。arrayTraversable

您可以使用iterator_to_arrayArrayIterator 或省略类型提示。请注意,iterator_to_array会将整个迭代器复制到数组中,因此可能效率低下。

// These functions are functionally equivalent but do not all accept the same arguments
function foo(array $a) { foobar($a); }
function bar(Traversable $a) { foobar($a); }
function foobar($a) {
    foreach($a as $key => $value) {
    }
}

$array = array(1,2,3)
$traversable = new MyTraversableObject();

foo($array);
foo(iterator_to_array($traversable));

bar(new ArrayIterator($array));
bar($traversable);

foobar($array);
foobar($traversable);