hack集合:Constructing
使用Hack集合与使用数组非常相似。事实上,您可以使用Hack集合在常规<?php文件中,因为它们直接构建到HHVM运行时(唯一的注意事项是在<?php文件中,必须使用前缀HH\)。
构建Hack集合可以使用new或称为文字语法来完成。这两个都基本上是如何创建数组的混合。
文字句法
如果要创建Hack集合并提供集合显式值(或键/值对),则要使用文字语法。
$collection = <CollectionType> { val1, val2, ... , valN };
$collection = <KeyedCollectionType> { key1 => val1, key2 => val2, ... , keyN => valN}
<?hh
namespace Hack\UserDocumentation\Collections\Constructing\Examples\Literal;
function run(): void {
$vec = Vector {'A', 'B', 'C'};
$ivec = ImmVector {'A', 'B', 'C'};
$map = Map {'A' => 1, 'B' => 2, 'C' => 3};
$set = Set {'A', 'B', 'C'};
$pair = Pair {'A', 'B'};
var_dump($vec);
var_dump($ivec);
var_dump($map);
var_dump($set);
var_dump($pair);
}
run();
Output
object(HH\Vector)#1 (3) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "C"
}
object(HH\ImmVector)#2 (3) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "C"
}
object(HH\Map)#3 (3) {
["A"]=>
int(1)
["B"]=>
int(2)
["C"]=>
int(3)
}
object(HH\Set)#4 (3) {
string(1) "A"
string(1) "B"
string(1) "C"
}
object(HH\Pair)#5 (2) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
}
您可以在任何地方使用文字语法array(),包括初始化对象或类属性的表达式。
<?hh
namespace Hack\UserDocumentation\Collections\Constructing\Examples\ClassProp;
class A {
public static Map<int, string> $users = Map {};
public static array<int, string> $users_a = array();
// Cannot do something like this because function calls
// aren't allowed in static class property initializers
//public static Map<int, string> $users_bad = Map {rand(0, 10) => 'a'};
}
function run(): void {
A::$users[0] = "Joel";
A::$users_a[0] = "Fred";
var_dump(A::$users);
var_dump(A::$users_a);
}
run();
Output
object(HH\Map)#1 (1) {
[0]=>
string(4) "Joel"
}
array(1) {
[0]=>
string(4) "Fred"
}
没有用于文字语法的类型参数(例如,$v = Vector<int> {1};是语法错误)。该typechecker将推断和跟踪类型的内部。
运用 new
您还可以使用new创建Hack集合的实例。但是,您必须传递构造函数a Traversable(像数组)或null。
$ collection = new <CollectionType>(?Traversable <Tv> $ t);
$ collection = new <KeyedCollectionType>(?KeyedTraversable <Tk,Tv> $ t);
<?hh
namespace Hack\UserDocumentation\Collections\Constructing\Examples\UsingNew;
function convert(array<int> $arr): Vector<int> {
var_dump($arr instanceof Traversable);
return new Vector($arr);
}
function run(): void {
$arr = array(1, 2, 3);
var_dump(convert($arr));
}
run();
Output
bool(true)
object(HH\Vector)#1 (3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}