我什么时候会在 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
,而不是 string
。 dict
或 keyset
不是这种情况。
- 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),而不是集合对象具有的稍微不同的
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
,而不是string
。dict
或keyset
不是这种情况。 - 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),而不是集合对象具有的稍微不同的