Traversable 接口

(PHP 5, PHP 7, PHP 8)

介绍

用于检测类是否可以使用 foreach 进行遍历的接口。

无法单独实现的抽象基础接口。它必须由 IteratorAggregateIterator 实现。

接口概要

interface Traversable {
}

此接口没有方法,它唯一的目的是作为所有可遍历类的基础接口。

变更日志

版本 描述
7.4.0 Traversable 接口现在可以由抽象类实现。扩展类必须实现 IteratorIteratorAggregate

备注

注意:

实现此接口的内部(内置)类可以在 foreach 结构中使用,并且不需要实现 IteratorAggregateIterator

注意:

在 PHP 7.4.0 之前,此内部引擎接口无法在 PHP 脚本中实现。请改用 IteratorAggregateIterator

添加备注

用户贡献的备注 5 个备注

kevinpeno at gmail dot com
14 年前
虽然您不能实现此接口,但您可以在检查中使用它来确定某些内容是否可以在 for each 中使用。以下是我在期望可以通过 foreach 迭代的内容时使用的代码。

<?php
if( !is_array( $items ) && !$items instanceof Traversable )
// 在此处抛出异常
?>
cobaltbluedw
8 年前
注意:虽然对象和数组可以通过 foreach 进行遍历,但它们并没有实现“Traversable”,因此您不能使用 instanceof 检查来检查 foreach 兼容性。

示例

$myarray = array('one', 'two', 'three');
$myobj = (object)$myarray;

if ( !($myarray instanceof \Traversable) ) {
print "myarray is NOT Traversable";
}
if ( !($myobj instanceof \Traversable) ) {
print "myobj is NOT Traversable";
}

foreach ($myarray as $value) {
print $value;
}
foreach ($myobj as $value) {
print $value;
}

输出
myarray is NOT Traversable
myobj is NOT Traversable
one
two
three
one
two
three
douglas at reith dot com dot au
7 年前
PHP7 的 iterable 伪类型将匹配 Traversable 和数组。非常适合返回值类型提示,这样您就不必将您的域暴露给基础设施代码,例如,存储库不是返回游标,而是可以返回提示“iterable”。
<?php
UserRepository
::findUsers(): iterable
?>

链接:https://php.net/manual/en/migration71.new-features.php#migration71.new-features.iterable-pseudo-type

此外,您可以使用 is_iterable() 方法代替
<?php
if( !is_array( $items ) && !$items instanceof Traversable )
// 在此处抛出异常
?>

您可以使用 is_iterable() 方法执行以下操作
<?php
if ( !is_iterable( $items ))
// 在此处抛出异常
?>

链接:https://php.net/manual/en/function.is-iterable.php
ajf at ajf dot me
9 年前
请注意,所有对象都可以使用 foreach 进行迭代,它将遍历每个属性。这只是描述类是否实现迭代器,即是否有自定义行为。
alan dot bem at gmail dot com
5 年前
实际上,您可以在 php 脚本中使用“Traversable” - 您可以使用它来强制用户空间对象的可迭代性。

<?php

interface Stream implements \Traversable {}

class
InMemoryStream implements IteratorAggregate, Stream
{
public function
getIterator() {}
}

$stream = new InMemoryStream();
?>

如果您忘记实现“IteratorAggregate”或“Iterator”接口,则在实例化相关对象时将引发致命错误。

<?php

interface Stream implements \Traversable {}

class
InMemoryStream implements Stream {}

$stream = new InMemoryStream(); // 致命错误:类 InMemoryStream 必须实现接口 Traversable 作为 Iterator 或 IteratorAggregate 的一部分,位置:Unknown,第 0 行
?>
To Top