有人可以在功能和操作方面清楚地解释PHP中ArrayIterator
,ArrayObject
和Array
之间的根本区别吗?谢谢!
最佳答案
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 ....
数组(本机类型)比对象快得多。另一方面,
ArrayObject
和ArrayIterator
类定义了可以使用的某些方法,而数组没有这种方法比较
ArrayObject
与ArrayIterator
这两个之间的主要区别在于类具有的方法。
ArrayIterator
实现Iterator
接口(interface),该接口(interface)为它提供与元素上的迭代/循环相关的方法。 ArrayObject
有一种称为exchangeArray
的方法,可以将其内部数组与另一个数组交换。在ArrayIterator
中实现类似的操作将意味着要么创建一个新对象,要么循环遍历各个键和unset
,将所有这些键一一对应,然后一一设置新数组中的元素。接下来,由于无法迭代
ArrayObject
,因此当您在foreach
中使用它时,它会在内部创建ArrayIterator
对象(与数组相同)。这意味着php创建原始数据的副本,现在有2个具有相同内容的对象。对于大型阵列,这将被证明是效率低下的。但是,您可以指定用于迭代器的类,因此您可以在代码中包含自定义迭代器。希望这会有所帮助。欢迎对此答案进行编辑。