虽然您不能实现此接口,但您可以在检查中使用它来确定某些内容是否可以在 for each 中使用。以下是我在期望可以通过 foreach 迭代的内容时使用的代码。
<?php
if( !is_array( $items ) && !$items instanceof Traversable )
// 在此处抛出异常
?>
(PHP 5, PHP 7, PHP 8)
此接口没有方法,它唯一的目的是作为所有可遍历类的基础接口。
版本 | 描述 |
---|---|
7.4.0 | Traversable 接口现在可以由抽象类实现。扩展类必须实现 Iterator 或 IteratorAggregate。 |
注意:
实现此接口的内部(内置)类可以在 foreach 结构中使用,并且不需要实现 IteratorAggregate 或 Iterator。
注意:
在 PHP 7.4.0 之前,此内部引擎接口无法在 PHP 脚本中实现。请改用 IteratorAggregate 或 Iterator。
虽然您不能实现此接口,但您可以在检查中使用它来确定某些内容是否可以在 for each 中使用。以下是我在期望可以通过 foreach 迭代的内容时使用的代码。
<?php
if( !is_array( $items ) && !$items instanceof Traversable )
// 在此处抛出异常
?>
注意:虽然对象和数组可以通过 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
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
实际上,您可以在 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 行
?>