ZetCode

PHP iterable 关键字

最后修改于 2025 年 4 月 16 日

PHP 中的 iterable 伪类型是在 PHP 7.1 中引入的。它充当可以与 foreach 一起迭代的值的类型提示。iterable 类型同时接受数组和实现 Traversable 的对象。

基本定义

iterable 是 PHP 中的内置伪类型,代表数组或 Traversable 对象。它用于参数和返回类型声明。

创建 iterable 类型是为了简化与不同可迭代结构的工作。在 PHP 7.1 之前,您必须单独使用 array 或 Traversable。

语法:function foo(iterable $iterable) {}function bar(): iterable {}。iterable 类型可以在接受类型提示的任何地方使用。

基本 iterable 参数

此示例显示了一个接受 iterable 参数的函数。

basic_iterable.php
<?php

declare(strict_types=1);

function printIterable(iterable $iterable): void {
    foreach ($iterable as $item) {
        echo $item . " ";
    }
}

$array = [1, 2, 3];
printIterable($array);

printIterable 函数接受任何可迭代值。我们传递了一个数组,它是自动有效的。然后该函数使用 foreach 迭代每个项目。这演示了基本 iterable 类型的用法。

iterable 返回类型

此示例演示了一个返回 iterable 值的函数。

iterable_return.php
<?php

declare(strict_types=1);

function getIterable(): iterable {
    return ['a', 'b', 'c'];
}

$letters = getIterable();
foreach ($letters as $letter) {
    echo $letter . " ";
}

getIterable 函数声明它将返回一个 iterable。它返回一个满足返回类型的数组。调用代码然后可以迭代返回的值。这显示了 iterable 在返回位置的使用。

Generator 作为 iterable

此示例展示了如何将生成器与 iterable 类型一起使用。

generator_iterable.php
<?php

declare(strict_types=1);

function getGenerator(): iterable {
    yield 'apple';
    yield 'banana';
    yield 'cherry';
}

$fruits = getGenerator();
foreach ($fruits as $fruit) {
    echo $fruit . " ";
}

生成器实现了 Traversable 接口,使其成为有效的可迭代对象。getGenerator 函数生成值而不是返回数组。调用代码将生成器视为与其他可迭代对象一样。这展示了 iterable 与不同数据源的灵活性。

类型检查 iterable

此示例演示了检查变量是否可迭代。

is_iterable.php
<?php

declare(strict_types=1);

function checkIterable($value): void {
    if (is_iterable($value)) {
        echo "Value is iterable";
    } else {
        echo "Value is not iterable";
    }
}

$array = [1, 2, 3];
$object = new stdClass();

checkIterable($array);
checkIterable($object);

is_iterable 函数检查一个值是否可以被迭代。数组通过此检查,而普通对象则不能。这对于运行时类型验证很有用。该函数有助于确保值可以在 foreach 循环中使用。

iterable 与 Iterator

此示例展示了一个自定义迭代器类用作 iterable。

iterator_iterable.php
<?php

declare(strict_types=1);

class NumberIterator implements Iterator {
    private $numbers = [10, 20, 30];
    private $position = 0;

    public function current() { return $this->numbers[$this->position]; }
    public function key() { return $this->position; }
    public function next(): void { $this->position++; }
    public function rewind(): void { $this->position = 0; }
    public function valid(): bool { return isset($this->numbers[$this->position]); }
}

function printNumbers(iterable $numbers): void {
    foreach ($numbers as $number) {
        echo $number . " ";
    }
}

$iterator = new NumberIterator();
printNumbers($iterator);

NumberIterator 类实现了 Iterator 接口。这使其成为可迭代对象。printNumbers 函数接受任何可迭代对象,包括我们的自定义迭代器。这展示了 iterable 如何与自定义遍历逻辑一起工作。

iterable 在类方法中

此示例显示了 iterable 在类方法签名中的使用。

class_iterable.php
<?php

declare(strict_types=1);

class DataProcessor {
    private iterable $data;

    public function setData(iterable $data): void {
        $this->data = $data;
    }

    public function process(): void {
        foreach ($this->data as $item) {
            echo "Processing: " . $item . "\n";
        }
    }
}

$processor = new DataProcessor();
$processor->setData(['x', 'y', 'z']);
$processor->process();

DataProcessor 类以多种方式使用 iterable。setData 方法接受一个 iterable 参数。类属性也被类型为 iterable。这展示了 iterable 在面向对象环境中的用法。类型安全有助于确保整个过程中正确使用数据。

iterable 与 Variadic 函数

此示例演示了将 iterable 与可变参数一起使用。

variadic_iterable.php
<?php

declare(strict_types=1);

function mergeIterables(iterable ...$iterables): iterable {
    $result = [];
    foreach ($iterables as $iterable) {
        foreach ($iterable as $item) {
            $result[] = $item;
        }
    }
    return $result;
}

$merged = mergeIterables([1, 2], new ArrayIterator([3, 4]), ['a', 'b']);
print_r($merged);

mergeIterables 函数接受多个 iterable 作为可变参数。它将所有元素合并到一个数组中。该函数展示了 iterable 与不同输入类型的灵活性。带 iterable 的可变参数允许处理多个集合。

最佳实践

来源

PHP iterable 文档

本教程涵盖了 PHP 的 iterable 伪类型,并通过实际示例展示了与不同可迭代类型的参数、返回和属性用法。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 PHP 教程