有人可以在功能和操作方面清楚地解释PHP中ArrayIteratorArrayObjectArray之间的根本区别吗?谢谢!

最佳答案

Array是本机php类型。您可以使用php语言构造array()或从php 5.4起[]创建一个
ArrayObject是一种object,其作用与数组完全相同。这些可以使用new关键字创建
ArrayIterator类似于ArrayObject,但它可以对其自身进行迭代。也使用new创建

比较Array与(ArrayObject / ArrayIterator)

它们都可以使用php的数组语法来使用,例如。

$array[] = 'foo';
$object[] = 'foo';
// adds new element with the expected numeric key

$array['bar'] = 'foo';
$object['bar'] = 'foo';
// adds new element with the key "bar"

foreach($array as $value);
foreach($object as $value);
// iterating over the elements

但是,它们仍然是对象vs数组,因此您会注意到
is_array($array); // true
is_array($object); // false

is_object($array); // false
is_object($object); // true

大多数php数组函数都希望使用数组,因此在其中使用对象会引发错误。有许多这样的功能。例如。
sort($array); // works as expected
sort($object); // Warning: sort() expects parameter 1 to be array, object given in ......

最后,对象可以完成stdClass对象的预期操作,即使用对象语法访问公共(public)属性
$object->foo = 'bar'; // works
$array->foo = 'bar'; // Warning: Attempt to assign property of non-object in ....

数组(本机类型)比对象快得多。另一方面,ArrayObjectArrayIterator类定义了可以使用的某些方法,而数组没有这种方法

比较ArrayObjectArrayIterator

这两个之间的主要区别在于类具有的方法。
ArrayIterator实现Iterator接口(interface),该接口(interface)为它提供与元素上的迭代/循环相关的方法。 ArrayObject有一种称为exchangeArray的方法,可以将其内部数组与另一个数组交换。在ArrayIterator中实现类似的操作将意味着要么创建一个新对象,要么循环遍历各个键和unset,将所有这些键一一对应,然后一一设置新数组中的元素。

接下来,由于无法迭代ArrayObject,因此当您在foreach中使用它时,它会在内部创建ArrayIterator对象(与数组相同)。这意味着php创建原始数据的副本,现在有2个具有相同内容的对象。对于大型阵列,这将被证明是效率低下的。但是,您可以指定用于迭代器的类,因此您可以在代码中包含自定义迭代器。

希望这会有所帮助。欢迎对此答案进行编辑。

08-19 07:34