PHP Traversable类型提示

dte*_*ech 17 php arrays php-7.1

我有一个相对简单的功能,它使用了一个 foreach

function foo($t) {
     $result;
     foreach($t as $val) {
         $result = dosomething($result, $val);
     }
     return $result;
}
Run Code Online (Sandbox Code Playgroud)

我想输入提示,Traversable似乎是我需要的确切类型提示

 function foo(Traversable $t) {
Run Code Online (Sandbox Code Playgroud)

然而,这给出了E_RECOVERABLE_ERROR使用数组时(当然可以在a中使用foreach):例子

 Argument 1 passed to foo() must implement interface Traversable, array given
Run Code Online (Sandbox Code Playgroud)

有没有办法输入提示或这是不可能的?

And*_*rea 18

PHP 7.1 为此目的引入了iterable类型声明,它接受数组和实例\Traversable.

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


dte*_*ech 8

有一个错误:#41942.关闭为'不是错误'.由于PHP数组是不是对象,他们无法实现一个接口和这样一个没有办法输入提示都arrayTraversable.

您可以使用iterator_to_array,ArrayIterator或省略类型提示.请注意,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);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以执行`foo(new ArrayIterator(array(1,2,3))`将数组转换为对象. (2认同)