我什么时候会在 PHP 数组上使用 Hack 字典?

When would I use a Hack dict over a PHP array?

docs are pretty light. The interface looks almost identical to an array.

我什么时候应该选择听写?

php 中的数组既是字典又是向量。这很令人困惑。同样在数组中,有对整数的键强制转换。哪个更令人困惑。

Hack dicts 旨在消除歧义并解决键的问题。

展开一点:

  • 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 Arrays 提供一致的 API。虽然大多数容器函数可以将 PHP 数组作为输入,但它们会生成 Hack 数组。

一个更有趣的问题是"Hack arrays" (vec, dict, keyset), vs "Hack collections" (Map, Set, Vector) 和他们的 const/immutable 亲戚。这很有争议。

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

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