数组是Traversable的实例吗?

时间:2016-07-26 16:22:24

标签: php

这是我框架中的基本数组

 array(2) {
  [0]=>
  string(2) "40"
  [1]=>
  string(2) "41"
}

这是我的测试:

echo($array instanceof Traversable); // 0
echo(is_array($array)); // 1

似乎我的标准php数组不是Traversable的实例,似乎不一致。

3 个答案:

答案 0 :(得分:6)

是的,它不是Traversable。

界面Traversable的主要目标是使对象可以与foreach一起使用。

答案 1 :(得分:1)

无论是否一致,数组只是php中的原始类型(不是类),因此它不会遵循实现接口的面向对象样式-在这种情况下为Traversable接口。

但是,PHP提供了一种很好的方法,可以使用 \ ArrayObject 将数组转换为对象,该对象的行为几乎类似于数组(几乎因为它实际上是对象而不是数组):

$someArray = ['foo' => 'bar'];
$objectArray = new \ArrayObject($someArray);

// now you can use $objectArray as you would your $someArray:

// access values
$objectArray['foo']

// add values
$objectArray['boo'] = 'far';

// foreach it
foreach ($objectArray as $key => $value) { ... }

// it also implements \Traversable interface!
$objectArray instanceof \Traversable // true

答案 2 :(得分:0)

  • php中的数组是原始类型,原始类型不能继承 类或实现接口

  • 因此php中的数组类型不是Traversable的实例

我想添加的附加信息是:

  • 那个数组和 Traversable 组合形成了另一种叫做 iterable
  • 换句话说,php 中的 iterable 类型是 Traversable | array 的并集
  • 迭代器和生成器等接口类型实现了 Traversable,因此属于 iterable 类型
  • 如果您实现一个函数,该函数将我们想要迭代的参数作为参数(使用 foreach),但我们事先不知道它是数组还是其他 iterable 数据结构(就像一个实现 Iterator 的类)。