为什么Symfony提供了一个OrderedHashMap



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的上下文中,除了其他实现的功能外,面向对象的结构比原始类型(如intstringarray)更受欢迎,因为它们可以注入到类中进行单元测试。

面向对象的结构也可以强制不变量,而基元类型只能保存数据而没有任何行为。

相关内容

  • 没有找到相关文章

最新更新