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 参数的函数。
<?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 值的函数。
<?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 类型一起使用。
<?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
此示例演示了检查变量是否可迭代。
<?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。
<?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 在类方法签名中的使用。
<?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 与可变参数一起使用。
<?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 的可变参数允许处理多个集合。
最佳实践
- 类型安全:对于接受多种集合类型的参数,请使用 iterable。
- 文档:清楚地记录可迭代对象中预期的元素类型。
- 性能:请注意,生成器只能遍历一次。
- 灵活性:当可能使用 Traversable 对象时,优先使用 iterable 而不是 array。
- 验证:当类型提示不可用时,请使用 is_iterable() 进行运行时检查。
来源
本教程涵盖了 PHP 的 iterable 伪类型,并通过实际示例展示了与不同可迭代类型的参数、返回和属性用法。
作者
列出 所有 PHP 教程。