Symfony提供了一个OrderedHashMap
。其文件指出
与关联数组不同,映射会跟踪添加和删除键的顺序。此顺序在迭代期间反映出来。
我对这种说法感到困惑,因为我认为 PHP 关联数组实际上已经是有序映射。我在SO上发现了这个问题,这证实了我之前的假设:PHP关联数组是有序的吗?
我想知道,如果Symfony开发人员不知道PHP数组已经是有序的映射,或者我不了解SymfonyOrderedHashMap
的作用
当然,PHP 的数组是一个有序映射。
但是Symfony的OrderedHashMap
与PHP的数组有一些不同的行为(比如功能)。
OrderedHashMap
支持迭代期间并发修改。这意味着您可以在foreach
循环中插入和删除元素,迭代器将相应地反映这些更改。但是,array
迭代中是复制的(写入时复制),则任何修改都不会反映在循环中。
$map = new OrderedHashMap();
$map[1] = 1;
$map[2] = 2;
$map[3] = 3;
foreach ($map as $index => $value) {
echo "$index: $valuen"
if (1 === $index) {
$map[1] = 4;
$map[] = 5;
}
}
如果您使用的是array
,您将获得不同的输出。在array
的迭代中,循环不会看到数字5
。
关于">为什么?":在Symfony的代码库中搜索它。只有一个地方可以使用OrderedHashMap
,用于存储表单的子项。new InheritDataAwareIterator($this->children)
使用它进行迭代。所以我认为答案是帮助处理表格的子项。
感谢@fishbone:
因此,好处不是排序,而是循环修改它的能力。
一般来说,不仅在Symfony的上下文中,除了其他实现的功能外,面向对象的结构比原始类型(如int
,string
或array
)更受欢迎,因为它们可以注入到类中进行单元测试。
面向对象的结构也可以强制不变量,而基元类型只能保存数据而没有任何行为。