什么时候在PHP数组上使用Hack dict?

hur*_*lad 5 data-structures hacklang

文档很轻。接口看起来几乎与数组相同。

我什么时候应该选择字典?

Pab*_*lla 7

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

Hack dicts旨在消除歧义并解决密钥问题。


Fre*_*ott 5

扩展一下:

  • Hack 与 PHP 不同——最终,这可能意味着 PHP 数组要么在某个时候从该语言中删除,要么变得相当不方便。最后,如果您正在编写 Hack,您应该更喜欢 Hack dict/vec/keyset 而不是 PHP 数组。
  • 就 Pablo 的观点而言,array<string, Tv>这是一个谎言,并且破坏了 Hack 的类型系统。array_keys(['123' => 'bar'])[0]int,不是stringdict或 的情况并非如此keyset
  • Hack 标准库为 Hack Arrays 提供了一致的 API。虽然大多数容器函数可以将 PHP 数组作为输入,但它们会生成 Hack 数组。

一个更有趣的问题是“Hack 数组”( vec, dict, keyset) 与“Hack 集合”( Map, Set,Vector)及其 const/immutable 亲戚。这是很有争议的。

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

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