博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Hack与HHVM权威指南》——1.6.2 未决的类型
阅读量:7252 次
发布时间:2019-06-29

本文共 1417 字,大约阅读时间需要 4 分钟。

本节书摘来自华章出版社《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节中再次讨论有关“未决的类型”的相关内容。

转载地址:http://gxebm.baihongyu.com/

你可能感兴趣的文章
[Sdoi2016]平凡的骰子
查看>>
mysql定义游标
查看>>
两个有序数组合并算法
查看>>
面向对象设计原则之五:迪米特法则
查看>>
GitHub for Windows简单使用
查看>>
c#操作XML
查看>>
作为一个测试leader平时应该注意哪些方面
查看>>
【DOM编程艺术】Ajax(Hijax)
查看>>
微信公众平台开发(十) 消息回复总结——用其xml模板
查看>>
iOS.CM5.CM4.CM2
查看>>
菜鸟学T-SQL---------SQL2005读书笔记1
查看>>
Python--函数(全局变量和局部变量)
查看>>
PLSQL Developer 不能连接 oracle 11g 64位 的解决办法
查看>>
byobu相关操作
查看>>
父页面操作嵌套iframe子页面的HTML标签元素
查看>>
在TSQL中用case,when之类同时查多种情况
查看>>
Math,random()返回区间内的随机数
查看>>
TCP/IP网络协议的通俗理解,socket,http,soap
查看>>
简单数论
查看>>
Linux 文件系统
查看>>