扩展一下:
array<string, Tv>这是一个谎言,并且破坏了 Hack 的类型系统。array_keys(['123' => 'bar'])[0]是int,不是string。dict或 的情况并非如此keyset。一个更有趣的问题是“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