文档非常轻。该接口看起来几乎与数组完全相同。
我什么时候更喜欢dict?
破解dicts旨在消除歧义,并用密钥解决问题。
展开一点:
- Hack与PHP有所不同——最终,这可能意味着PHP数组在某个时候被从语言中删除,或者变得相当不方便。最终,如果你在写Hack,你应该更喜欢Hack dict/vec/keyset而不是PHP数组
- 在巴勃罗的观点上,
array<string, Tv>
是一个谎言,打破了哈克的类型体系。array_keys(['123' => 'bar'])[0]
是int
,而不是string
。dict
或keyset
的情况并非如此 - 黑客标准库为黑客阵列提供了一致的API。虽然大多数容器函数可以将PHP数组作为输入,但它们会生成Hack数组
一个更有趣的问题是"黑客数组"(vec
、dict
、keyset
)与"黑客集合"(Map
、Set
、Vector
)及其常量/不可变亲属。这很有争议。
主要区别在于它们是对象,而不是值;这实际上意味着,传递给它们的函数可以对它们进行变异,而vec/dict/keyset的行为就好像它们是写时复制一样。通常需要写时复制行为,但偶尔也需要对象行为。
这就是它引起争议的地方:-有些人认为,如果你想要类似对象的语义,你应该使用Hack Collections-我个人认为最好将其包装在一个"Ref"类中:例如class Ref<T> { public function __construct(public T $value) {}
-并使用标准的API对$ref->value
进行操作;这使您可以对两者使用相同的API(HSL),而不是集合对象具有的略微不同的API