举个例子,假设我有一个以下形状的类型foo
,
type foo = shape(
?'bar' => float,
...
);
现在,如果我尝试通过以下方式访问字段bar
的值,
do_something_with($rcvd['bar']);
如果$rcvd
属于foo
类型,则它不起作用,因为bar
是可选成员,并且对于实例$rcvd
可能不存在。 因此,对于这个给定的示例,问题是 - 如何访问$rcvd
的成员bar
?
好的,找到了:https://docs.hhvm.com/hack/reference/class/HH.Shapes/idx/
所以正确的方法是,
Shapes::idx($rcvd, 'bar');
您可以使用答案中提到的Shapes::idx
方法。
但您也可以使用 null coalesce 运算符,您可能更熟悉其他编程语言(如 PHP 和 C#)。
请参阅:https://docs.hhvm.com/hack/expressions-and-operators/coalesce
例:
type Foo = shape(
'bar' => ?int,
?'baz' => int,
);
function qux(Foo $foo): int {
$default = 1;
// foo[bar] is null ? set default.
$bar = $foo['bar'] ?? $default;
// foo[baz] doesn't exist ? set default.
$baz = $foo['baz'] ?? $default;
return $baz + $bar;
}
<<__EntryPoint>>
async function main(): Awaitable<noreturn> {
echo qux(shape(
'bar' => null,
)); // 2
echo qux(shape(
'bar' => 0,
)); // 1
echo qux(shape(
'bar' => 1,
)); // 2
echo qux(shape(
'bar' => 4,
'baz' => 2,
)); // 6
echo qux(shape(
'bar' => null,
'baz' => 0
)); // 1
}
Hack还支持空合并相等运算符。
例:
// foo[bar] is null ? set foo[bar] to default
$foo['bar'] ??= $default;
// foo[baz] is missing ? set foo[baz] to default
$foo['baz'] ??= $default;