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