
类型检查|
39
虽然这个闭包没有任何的返回类型标注(这在严格模式下也是合法的),类型检查器依
然能够推断出
$doubler(10)
是个整型。这是因为它分析了闭包的函数体内部的内容,
在
$x
是个整型的假设下,并且在两个整型上应用加号操作符,仍然会得到一个整型结
果
注
5
。同理,它可以推断出
$doubler(3.14)
是浮点数类型。
顺便提一下,正是因为类型推理能够对闭包内部进行推理,所以即使在严格模式下,也
允许闭包没有类型标注。
1.7
类型提炼
假设你有个
?string
类型的值,而且准备把这个值传递给一个参数类型为
string
的函
数。那么你怎么把一个类型
(?string)
转化为另外一个类型
(string)
呢?或者假设你有个
object
类型的值,它可能实现或没有实现
Polarizable
接口。同时,如果它实现了这
个接口,你还希望调用这个
object
的方法
polarize()
。那么类型检查器如何才能知道
polarize()
调
用是合法的?
在一个良好组织的代码中,实现一个值是一个类型同时又是另外一个类型的任务情况非
常常见。这些看起来非常琐碎的事情是你必须拿来安抚类型检查器的关键所在。这是
Hack
能够在开发前期就捕获问题的关键。这也是
Hack
能够避免像调用一个不存在的方
法、在不恰当的地方找到了一个空值,以及其他一些在
PHP
代码库开发调试中常见的恼
人错误这些情况的原因。
你有三种类型检查器使用的方式对这些类型进行提炼转化,它们是:是否为空检查、类
似
is_integer()
的
内置类型查询函数,以及
instanceof ...