Hack语言特性之类型化
Hack最基础的特性就是类型标注。PHP5已经开始支持对象的类型化,PHP7也提供了标量类型化声明。Hack提供了全面的类型标注支持,与其typecher配合使用,还可以实现快速、前置静态类型验证。
什么是类型标注?
类型标准允许给类属性、方法/函数参数、方法/函数返回值及代码其它组件添加显示类型,如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.
Hack语言特性之类型化的更多相关文章
- Hack语言类型化简介
在typechecker的配合下,Hack语言的类型化能力是Hack其他功能特性的基石.开发Hack语言的主要动机也正是为代码提供显式类型标注以便对代码进行类型一致性和潜在错误分析. 这是用于对比Ha ...
- Facebook的Hack语言三大看点
Hack语言主要有三大看点:类型化.异步.集合. Hack最基础的特性就是类型标注.PHP5已经开始支持对象的类型化,PHP7也提供了标量类型化声明.Hack提供了全面的类型标注支持,与其typech ...
- Facebook Hack 语言 简介
1. Hack 是什么? Hack 是一种基于HHVM(HipHop VM 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT编译器,同时具有产生快速代码和即时编译的优点.)的 ...
- C# 3.0新语言特性和改进(一)
引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...
- 【转】浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- Pro ASP.NET MVC –第四章 语言特性精华
C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...
- 浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- XAML 名称范围 (x:) 语言特性
本节介绍为 Windows 运行时实现的 XAML 语言特性的参考信息. 本部分内容 主题 描述 x:Class 属性 配置 XAML 编译,在标记和代码隐藏之间连接分部类.代码分部类在一个独立的代码 ...
- C++ 语言特性的性能分析
转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html 大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...
随机推荐
- Flex contextMenu
没想到再这里也要跌跌撞撞. 这个东西我很久之前就懂了的啊! 最开始是这么写的: private function init():void { var contextMenu:ContextMenu = ...
- mvc项目controller重命名了,用原网页url访问不了了,怎么办?
如题.MVC项目,手机网站. 公司的官方微信上,用户关注之后,点击相应菜单就可以使用相关的功能. 最近项目重构,有些不规范的命名方式给予了重构.上线后,微信上发现一些网页访问不了了. 联系微信的维护人 ...
- EF架构~linq to entity的随机排序问题
回到目录 对于从linq to sql迁移过来的开发者,对随机排序不会感到陌生,直接为datacontext添加一个方法再配合反射就可以实现随机排序了,代码如下: /// <summary> ...
- 使用finfo_file()函数检测上传图片的类型
该函数可以检测文件的MIME类型.因为有时候我们只根据文件后缀来判断是不准确的. function getMIME($filename){ $finfo = finfo_open(FILEINFO_M ...
- Atitit java 二维码识别 图片识别
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...
- Maven Myeclipse 搭建项目
一.maven概述 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具! 简单说Maven 是一个项目管理和构建自动化工具 二.环境搭建 1. ...
- 纯CSS实现JS效果研究
利用CSS3:checked选择器和~配合实现tab切换 效果: 代码: <style> body,div,input,label{ margin:0; padding:0; } #tab ...
- java接口中多继承的问题
java中支撑多继承吗? 支持->接口啊 为什么接口支持多继承呢?因为接口中没有方法体!即使可能两个接口中有一样的抽象方法,但是 只会调用子类中覆盖该同样抽象方法的具体方法!不会引起调用的歧义! ...
- 《BI那点儿事》Microsoft 聚类分析算法——三国人物身份划分
什么是聚类分析? 聚类分析属于探索性的数据分析方法.通常,我们利用聚类分析将看似无序的对象进行分组.归类,以达到更好地理解研究对象的目的.聚类结果要求组内对象相似性较高,组间对象相似性较低.在三国数据 ...
- 邻接表有向图(三)之 Java详解
前面分别介绍了邻接表有向图的C和C++实现,本文通过Java实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http:/ ...