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

问题描述 投票:4回答:2

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

我什么时候应该选择dict?

data-structures hacklang
2个回答
6
投票

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

Hack dicts旨在消除歧义并用键修复问题。


2
投票

扩大一点:

  • Hack is diverging from PHP - 最终,这可能意味着PHP阵列在某些时候要么从语言中移除,要么变得相当不方便。最后,如果你正在编写Hack,你应该更喜欢Hack dict / vec / keyset而不是PHP数组。
  • 在Pablo的观点上,array<string, Tv>是一个谎言,打破了Hack的类型系统。 array_keys(['123' => 'bar'])[0]是一个int,而不是string。这不是dictkeyset的情况。
  • the Hack Standard Library为Hack Arrays提供了一致的API。虽然大多数容器函数可以将PHP数组作为输入,但它们将生成Hack数组。

一个更有趣的问题是“Hack阵列”(vecdictkeyset),vs“Hack collections”(MapSetVector)和他们的const / immutable亲戚。这是非常有争议的。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.