0
在线手册:中文 英文

Iterable 可迭代对象

Iterable是 PHP 7.1 中引入的一个伪类型。它接受任何 array 或实现了 Traversable 接口的对象。这些类型都能用 foreach 迭代, 也可以和 生成器 里的 yield from 一起使用。

使用可迭代对象

可迭代对象可以用作参数类型,表示函数需要一组值, 但是不会关心值集的形式,因为它将与 foreach 一起使用。如果一个值不是数组或 Traversable 的实例,则会抛出一个 TypeError

示例 #1 Iterable 可迭代参数类型示例

<?php

function foo(iterable $iterable) {
    foreach (
$iterable as $value) {
        
// ...
    

}

?>

声明为可迭代的参数可能会使用 null 或者一个数组作为默认值。

示例 #2 可迭代参数默认值示例

<?php

function foo(iterable $iterable = []) {
    
// ...
}

?>

可迭代对象还可以用作返回类型,表示函数将返回一个可迭代的值。 如果返回值不是数组或 Traversable 的实例,则会抛出一个 TypeError

示例 #3 可迭代返回类型示例

<?php

function bar(): iterable {
    return [
123];
}

?>

将可迭代对象声明为返回类型的函数也可能是 生成器

示例 #4 可迭代生成器返回类型的示例

<?php

function gen(): iterable {
    yield 
1;
    yield 
2;
    yield 
3;
}

?>

可迭代类型的协变

类在扩展/实现(extending/implementing)的时候, 可以将参数类型从 arrayTraversable 放宽到 iterable, 也可以将返回类型 iterable 的范围缩小到 arrayTraversable

示例 #5 可迭代的类型协变示例

<?php

interface Example {
    public function 
method(array $array): iterable;
}

class 
ExampleImplementation implements Example {
    public function 
method(iterable $iterable): array {
        
// 放宽了参数类型,缩窄了返回的类型
    
}
}

?>

0
在线手册:中文 英文

1位用户评论

[#1] ▲-15▼ j_jaberi@yahoo.com [39%] (2019-12-17 12:44:32)

Just to note: Though objects may (or may not) be Traversable, the can use in foreach because implicit conversion to array <?php
class Foo {
    public 
$a 1;
    public 
$b "Helo";
};

$bar = new Foo;

foreach(
$bar as $elm) {
    echo 
$elm ' ';
}

?>
prints 1 Hello Even <?php
$bar 
= new stdClass
foreach($bar as $elm) {
    echo 
$elm ' ';
}
?>
is correct.