ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Traversable(遍历)接口 ## **[Traversable(遍历)接口](https://www.php.net/manual/zh/class.traversable.php#class.traversable)** > 这是一个无法在 PHP 脚本中实现的内部引擎接口。无法被单独实现的基本抽象接口。相反它必须由**IteratorAggregate**或**Iterator**接口实现 ``` <pre class="calibre10">``` Traversable<span class="token3">{</span> <span class="token3">}</span> ``` ``` 目前为止只有instanceof能被我们使用 检测一个类(或者数组)是否可以使用[foreach](https://www.php.net/manual/zh/control-structures.foreach.php)进行遍历的接口【php7.1+可以使用is\_iterable来检查】 ``` <pre class="calibre10">``` <span class="token5">if</span> <span class="token3">(</span> <span class="token1">!</span><span class="token3">(</span>$myobj <span class="token5">instanceof</span> <span class="token4"><span class="token3">\</span>Traversable</span><span class="token3">)</span> <span class="token3">)</span> <span class="token3">{</span> print <span class="token2">"myobj is NOT Traversable"</span><span class="token3">;</span> <span class="token3">}</span> ``` ``` ``` <pre class="calibre10">``` <span class="token">//注意:虽然对象和数组可以由foreach遍历,但它们不实现“可遍历”,因此不能使用instanceof Traversable来检查foreach</span> $myarray <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token2">'one'</span><span class="token3">,</span> <span class="token2">'two'</span><span class="token3">,</span> <span class="token2">'three'</span><span class="token3">)</span><span class="token3">;</span> $myobj <span class="token1">=</span> <span class="token3">(</span>object<span class="token3">)</span>$myarray<span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span>$myarray <span class="token5">instanceof</span> <span class="token4">Traversable</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'[myarray]yes'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//php7.1+可以使用is_iterable来检查数组或者实现Traversable的类的迭代性</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">is_iterable</span><span class="token3">(</span>$myarray<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'$myarray is_iterable'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">if</span> <span class="token3">(</span>$myobj <span class="token5">instanceof</span> <span class="token4">Traversable</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'[myobj]yes'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">is_iterable</span><span class="token3">(</span>$myobj<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'$myobj is_iterable'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//那么instanceof Traversable在什么情况下生效(实现Iterator或IteratorAggregate接口的类)</span> class <span class="token4">A</span> <span class="token3">{</span> <span class="token3">}</span> class <span class="token4">B</span> implements <span class="token4">Iterator</span><span class="token3">{</span><span class="token">//Iterator继承Traversable</span> public <span class="token5">function</span> current <span class="token3">(</span><span class="token3">)</span><span class="token3">{</span><span class="token3">}</span> <span class="token">//返回当前产生的值</span> public <span class="token5">function</span> key <span class="token3">(</span><span class="token3">)</span><span class="token3">{</span><span class="token3">}</span> <span class="token">//返回当前产生的键</span> public <span class="token5">function</span> next <span class="token3">(</span><span class="token3">)</span><span class="token3">{</span><span class="token3">}</span> <span class="token">// 生成器继续执行</span> public <span class="token5">function</span> rewind <span class="token3">(</span><span class="token3">)</span><span class="token3">{</span><span class="token3">}</span> <span class="token">//重置迭代器</span> public <span class="token5">function</span> valid <span class="token3">(</span><span class="token3">)</span><span class="token3">{</span><span class="token3">}</span> <span class="token">//检查迭代器是否被关闭</span> <span class="token3">}</span> $a<span class="token1">=</span><span class="token5">new</span> <span class="token4">A</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $b<span class="token1">=</span><span class="token5">new</span> <span class="token4">B</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span>$a <span class="token5">instanceof</span> <span class="token4">Traversable</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'[A]yes'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">if</span> <span class="token3">(</span>$b <span class="token5">instanceof</span> <span class="token4">Traversable</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'[B]yes'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//不能直接实现Traversable会报致命错误</span> class <span class="token4">S</span> implements <span class="token4">Traversable</span> <span class="token3">{</span><span class="token3">}</span> ``` ``` 结果: ``` <pre class="calibre17">``` $myarray is_iterable <span class="token3">[</span>B<span class="token3">]</span>yes Fatal error<span class="token3">:</span> Class <span class="token4">S</span> must implement interface <span class="token4">Traversable</span> as part of either Iterator or IteratorAggregate <span class="token5">in</span> Unknownon line <span class="token6">0</span> ``` ```