我何时会在PHP数组上使用Hack dict?

时间:2017-02-02 19:00:15

标签: data-structures hacklang

docs很轻松。界面看起来几乎与array相同。

我什么时候应该选择dict?

2 个答案:

答案 0 :(得分:5)

php中的数组既可以是字典也可以是矢量。这非常令人困惑。同样在数组中,存在对整数的密钥强制。哪个更令人困惑。

Hack dicts旨在消除模糊性并用键修复问题。

答案 1 :(得分:2)

要扩展一点:

  • Hack is diverging from PHP-最终,这很可能意味着PHP数组有时会从该语言中删除,或者变得非常不便。最终,如果您要编写Hack,则应该首选Hack dict / vec / keyset而不是PHP数组。
  • 就Pablo而言,array<string, Tv>是一个谎言,破坏了Hack的类型系统。 array_keys(['123' => 'bar'])[0]int,而不是stringdictkeyset并非如此。
  • the Hack Standard Library为Hack阵列提供了一致的API。尽管大多数容器函数可以将PHP数组作为输入,但它们会产生Hack数组。

一个更有趣的问题是“ Hack数组”(vecdictkeyset)和“ Hack集合”(MapSetVector)及其常量/不可变亲戚。这很有争议。

主要区别在于它们是对象,而不是值。这实际上意味着传递给它们的函数可以对其进行突变,而vec / dict / keyset的行为就像它们是写时复制的。通常需要写时复制行为,但偶尔也需要对象行为。

这是引起争议的地方: -有些人认为,如果您想要类对象的语义,则应使用Hack Collections -我个人认为最好将其包装在“ Ref”类中:例如class Ref<T> { public function __construct(public T $value) {}-并使用标准API在$ref->value上进行操作;这样一来,您就可以为两者使用相同的API(HSL),而不是集合对象具有的API稍有不同