Hack语言特性之类型化
2016-05-08 23:07
302 查看
Hack最基础的特性就是类型标注。PHP5已经开始支持对象的类型化,PHP7也提供了标量类型化声明。Hack提供了全面的类型标注支持,与其typecher配合使用,还可以实现快速、前置静态类型验证。
举个例子,下面的代码是用正规的PHP编写的,没有任何类型:
代码作者的本意很清楚,$a 和 $b都是int型,代码也是用于算术运算。但实际上没有写任何代码来保证这个计算能正常进行。
假设你在对该代码进行测试,在$a的值始终为正整数时好像每次都是正常的。你不会天真的以为这是段无错代码吧,看看这种情况:当$a <= 0,且$b不是int型值时,就会导致意图不明的结果!
Hack的类型标注机制可以帮助你防止这类运行时错误。你可以显式告知Hack你所希望的变量类型:
typechecker现在可以准确知晓开发者的意图:两个参数都是整数。typechecker会扫描所有代码,且在每行代码执行时知道是否不变量是否满足条件。不用关心$a在运行时的值 - typechecker会确保$b类型是准确的。换句话说,Hack的typechecker执行静态类型检查 - Hack是一种静态类型语言。
静态类型语言 在编译期间进行类型检测,通常可以防止类型相关的错误。
动态类型语言 在运行时进行类型检测,允许更多的灵活性,在损失让类型错误通过的情况下
你可以采用Hack的强类型特性,也可以继续在Hack中享受动态类型语言的灵活性。
在运行之前捕捉bug
允许IDE自动完成类型敏感的函数,并提供行间错误通知
清晰的向其它开发者表明意图
阻止不安全的编码实践如 switch fallthrough.
什么是类型标注?
类型标准允许给类属性、方法/函数参数、方法/函数返回值及代码其它组件添加显示类型,如int。举个例子,下面的代码是用正规的PHP编写的,没有任何类型:
<?php namespace Hack\UserDocumentation\Overview\Typing\Examples\PHPFunction; function bar($a, $b) { if ($a > 0) { return true; } else { return $b < 0; } } var_dump(bar(3, -1)); var_dump(bar(-1, 10)); Output bool(true) bool(false)
代码作者的本意很清楚,$a 和 $b都是int型,代码也是用于算术运算。但实际上没有写任何代码来保证这个计算能正常进行。
假设你在对该代码进行测试,在$a的值始终为正整数时好像每次都是正常的。你不会天真的以为这是段无错代码吧,看看这种情况:当$a <= 0,且$b不是int型值时,就会导致意图不明的结果!
Hack的类型标注机制可以帮助你防止这类运行时错误。你可以显式告知Hack你所希望的变量类型:
<?hh namespace Hack\UserDocumentation\Overview\Typing\Examples\HackFunction; function bar(int $a, int $b) { if ($a > 0) { return true; } else { return $b < 0; } } var_dump(bar(3, -1)); var_dump(bar(-1, 10)); Output bool(true) bool(false)
typechecker现在可以准确知晓开发者的意图:两个参数都是整数。typechecker会扫描所有代码,且在每行代码执行时知道是否不变量是否满足条件。不用关心$a在运行时的值 - typechecker会确保$b类型是准确的。换句话说,Hack的typechecker执行静态类型检查 - Hack是一种静态类型语言。
静态类型语言 在编译期间进行类型检测,通常可以防止类型相关的错误。
动态类型语言 在运行时进行类型检测,允许更多的灵活性,在损失让类型错误通过的情况下
你可以采用Hack的强类型特性,也可以继续在Hack中享受动态类型语言的灵活性。
为什么这一点很有用?
如果你正在编写代码,可能有隐式类型的概念;当你敲出一行代码时,你脑袋里是会假定变量、参数等的类型的。Hack的类型标注机制帮助开发者少犯错误并少引入错误:在运行之前捕捉bug
允许IDE自动完成类型敏感的函数,并提供行间错误通知
清晰的向其它开发者表明意图
阻止不安全的编码实践如 switch fallthrough.
相关文章推荐
- Ioinc框架
- VIJOS 1923 漫长的等待
- 一夫一妻制往哪里去——走好,父亲!
- ReentrantLock 与 synchronized 一点区别
- hdu_3062_Party(2-SAT)
- Flatten Nested List Iterator
- HDU 2883 —— kebab
- hdu_3062_Party(2-SAT)
- 20145222黄亚奇《Java程序设计》实验五实验报告
- 20150418--商品订单+放大镜
- 5月6日 数据查询
- 搭建 Win CE6.0 设备开发环境
- Spring入门之关于IOC和DI的大致启动流程
- 百度一面总结
- Problem-A
- 【160406 24:00】四则运算 4(结对开发 2)
- 在线项目管理工具
- java内存区域与内存溢出异常
- CLR线程概览(下)
- Facebook的Hack语言三大看点