PHP Conference Japan 2024

Traversable 接口

(PHP 5, PHP 7, PHP 8)

简介

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

不能单独实现的抽象基接口。它必须由 IteratorAggregateIterator 实现。

接口概要

interface Traversable {
}

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

变更日志

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

备注

注意:

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

注意:

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

添加备注

用户贡献的笔记 4 个笔记

165
kevinpeno at gmail dot com
14 年前
虽然你不能实现这个接口,但你可以在你的检查中使用它来确定某些东西是否可以在 foreach 中使用。如果我期望某些东西必须通过 foreach 进行迭代,我会使用以下方法。

<?php
if( !is_array( $items ) && !$items instanceof Traversable )
//在此处抛出异常
?>
101
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
66
douglas at reith dot com dot au
7 年前
PHP7 的 iterable 伪类型将同时匹配 Traversable 和数组。非常适合返回类型提示,这样你就不必将你的领域暴露给基础设施代码,例如,Repository 返回游标而不是返回提示 'iterable'
<?php
UserRepository
::findUsers(): iterable
?>

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

此外,而不是
<?php
if( !is_array( $items ) && !$items instanceof Traversable )
//在此处抛出异常
?>

你现在可以使用 is_iterable() 方法:
<?php
if ( !is_iterable( $items ))
//在此处抛出异常
?>

链接:https://php.net/manual/en/function.is-iterable.php
64
ajf at ajf dot me
9 年前
注意,无论如何,所有对象都可以使用 foreach 进行迭代,它将遍历每个属性。这只是描述类是否实现了迭代器,即是否有自定义行为。
To Top