答案 0 :(得分:5)
php中的数组既可以是字典也可以是矢量。这非常令人困惑。同样在数组中,存在对整数的密钥强制。哪个更令人困惑。
Hack dicts旨在消除模糊性并用键修复问题。
答案 1 :(得分:2)
要扩展一点:
array<string, Tv>
是一个谎言,破坏了Hack的类型系统。 array_keys(['123' => 'bar'])[0]
是int
,而不是string
。 dict
或keyset
并非如此。一个更有趣的问题是“ Hack数组”(vec
,dict
,keyset
)和“ Hack集合”(Map
,Set
, Vector
)及其常量/不可变亲戚。这很有争议。
主要区别在于它们是对象,而不是值。这实际上意味着传递给它们的函数可以对其进行突变,而vec / dict / keyset的行为就像它们是写时复制的。通常需要写时复制行为,但偶尔也需要对象行为。
这是引起争议的地方:
-有些人认为,如果您想要类对象的语义,则应使用Hack Collections
-我个人认为最好将其包装在“ Ref”类中:例如class Ref<T> { public function __construct(public T $value) {}
-并使用标准API在$ref->value
上进行操作;这样一来,您就可以为两者使用相同的API(HSL),而不是集合对象具有的API稍有不同