####本节书摘来自华章出版社《Hack与HHVM权威指南》一书中的第1章,第1.8节,作者 Owen Yamauchi,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.8 运行环境中的类型标注的执行
在一个Hack代码库中,即使类型检查器并没有报告错误,但是在运行环境仍然可能有错误发生。这种情况最明显的情形就是通过耦合模式:因为在耦合模式下,代码并不会进行类型检查。所以对函数的调用传递了错误类型的参数值,也是有可能的。
在未来的发布版本中,HHVM的运行环境类型检查将会更加严格,但是目前的版本中,在运行环境中对类型标注的检查只是部分支持。
首先,HHVM会忽略属性值的类型标注,你可以对一个类型标注的属性赋予任何喜欢的值。HHVM并不会抱怨。
参数的类型标注行为和PHP的类型提示的一样,一旦违反了规则,一个可捕捉的致命错误将会产生注9。对返回类型标注也是一样的。
违反规则时,你可以把任何参数或者返回类型标注产生的致命错误变成一个警告错误,方法就是在最前面加个@符号。这称为一个软(soft)标注。对于已经存在的代码添加新的标注时,“软标注”仅仅是个过渡性的措施(具体参见10.2.2节的内容)。最好不要在新代码中使用它,而对于已经存在的硬标注,当然也不要改成“软”的。
对于参数类型标注和返回类型标注来说,Hack类型标注的一些细节并没有被执行:
任何对原始类型、object类型、num或者arraykey的标注都是按原型执行的。
返回类型void并没有被执行。这就是说,如果一个函数的返回类型是void,那么它可以返回一个真实的值,这在程序真正运行时并不会引发任何错误。
对于tuple和shape的标注就是array。内部的类型并没有检查。
枚举标注被执行检查,就好像它们是枚举基础类型一样。在运行环境中,值并没有被检查,以确保它们是枚举的合法值。
泛型标注并没有和它的类型形参一起被执行检查。这就是说,一个array的类型标注被执行为array,内部类型并没有被检查。
nullable类型被正确检测了。