虽然你不能实现这个接口,但你可以在你的检查中使用它来确定某些东西是否可以在 foreach 中使用。如果我期望某些东西必须通过 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。
虽然你不能实现这个接口,但你可以在你的检查中使用它来确定某些东西是否可以在 foreach 中使用。如果我期望某些东西必须通过 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 和数组。非常适合返回类型提示,这样你就不必将你的领域暴露给基础设施代码,例如,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