php中的数组既可以是字典也可以是矢量。这非常令人困惑。同样在数组中,存在对整数的密钥强制。哪个更令人困惑。
Hack dicts旨在消除歧义并用键修复问题。
扩大一点:
array<string, Tv>
是一个谎言,打破了Hack的类型系统。 array_keys(['123' => 'bar'])[0]
是一个int
,而不是string
。这不是dict
或keyset
的情况。一个更有趣的问题是“Hack阵列”(vec
,dict
,keyset
),vs“Hack collections”(Map
,Set
,Vector
)和他们的const / immutable亲戚。这是非常有争议的。
主要区别在于它们是对象,而不是价值;这实际上意味着你传递它们的函数可以改变它们,而vec / dict / keyset就好像它们是写时复制一样。通常需要写时复制行为,但偶尔也需要对象行为。
这就是争议的地方: - 有人认为,如果你想要类似对象的语义,你应该使用Hack Collections - 我个人认为最好把它包装在'Ref'类中:例如class Ref<T> { public function __construct(public T $value) {}
- 使用标准API操作$ref->value
;这允许您为两者使用相同的API(HSL),而不是集合对象具有的略微不同的API