《Hack与HHVM权威指南》——1.6.2 未决的类型

本节书摘来自华章出版社《Hack与HHVM权威指南》一书中的第1章,第1.6.2节,作者 Owen Yamauchi,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.6.2 未决的类型

事实上,如果一个变量没有类型定义的话,那就意味着类型检查器需要一个途径来处理下例中的代码:

if (some_condition()) {
  $x = 10; 
} else {
  $x = 'ten'; 
}

这种模式在PHP中是比较常见的,所以它在Hack中也是合法的。然后问题来了:在这个情况之后,类型检查器会认为$x的类型是什么呢?
答案就是它使用了一个未决的类型(unresolved type)。这是一个类型检查器用来记住$x每个可能拥有类型的结构体。在这种情况下,它将记住$x可能是个整型,也可能是个字符串类型。
在此情况之后,你可以用$x做任何一个整型和一个字符串类型可以做的操作。当然你也不能做任何对于整型或者字符串类型非法的操作。例如:

if (some_condition()) {
  $x = 10; 
} else {
  $x = 'ten'; 
}
echo $x;         // 成功: 你可以输出整型和字符串类型
echo $x + 20;     // 错误: 对于一个字符串类型,你不可以使用加号(加上整型)
echo $x->method();     // 错误: 无论是整型还是字符串类型,你都不可以调用一个方法
最重要的是,$x将会满足任何类型标注,包括整型和字符串类型。但是像arraykey和mixed类型,它并不会符合:
function takes_mixed(mixed $y): void {
}
function takes_int(int $y): void { 
}
function main(): void {
  if (some_condition()) {
    $x = 10;
  } else {
    $x = 'ten';
  }
  takes_int($x);     // 错误: $x可能是个字符串
  takes_mixed($x);     // OK 
}
这种情况也经常出现在类和接口层次结构上:
interface I {
}
class One implements I {
  public function method(): int {
    // ...
  }
} 
class Two implements I {
  public function method(): string {
    // ...
  } 
}
function main(): I {
  if (some_condition()) {
    $obj = new One();
  } else {
    $obj = new Two();
  }
  $int_or_string = $obj->method(); // OK
  return $obj; // OK 
}

这里,$obj->method()的调用是合法的,因为不管是类One还是类Two,都有一个合适的方法名和合适的参数数量。这个调用的返回的类型是个未决的类型,int或者string都有可能。
return语句也是合法的,因为无论那种$obj的可能性都符合返回类型声明I。
我们将在2.5节中再次讨论有关“未决的类型”的相关内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值