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语言特性之类型化的更多相关文章

  1. Hack语言类型化简介

    在typechecker的配合下,Hack语言的类型化能力是Hack其他功能特性的基石.开发Hack语言的主要动机也正是为代码提供显式类型标注以便对代码进行类型一致性和潜在错误分析. 这是用于对比Ha ...

  2. Facebook的Hack语言三大看点

    Hack语言主要有三大看点:类型化.异步.集合. Hack最基础的特性就是类型标注.PHP5已经开始支持对象的类型化,PHP7也提供了标量类型化声明.Hack提供了全面的类型标注支持,与其typech ...

  3. Facebook Hack 语言 简介

    1. Hack 是什么? Hack 是一种基于HHVM(HipHop VM 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT编译器,同时具有产生快速代码和即时编译的优点.)的 ...

  4. C# 3.0新语言特性和改进(一)

    引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...

  5. 【转】浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  6. Pro ASP.NET MVC –第四章 语言特性精华

    C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...

  7. 浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  8. XAML 名称范围 (x:) 语言特性

    本节介绍为 Windows 运行时实现的 XAML 语言特性的参考信息. 本部分内容 主题 描述 x:Class 属性 配置 XAML 编译,在标记和代码隐藏之间连接分部类.代码分部类在一个独立的代码 ...

  9. C++ 语言特性的性能分析

    转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html      大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...

随机推荐

  1. Redis学习笔记~关于空间换时间的查询案例

    回到目录 空间与时间 空间换时间是在数据库中经常出现的术语,简单说就是把查询需要的条件进行索引的存储,然后查询时为O(1)的时间复杂度来快速获取数据,从而达到了使用空间存储来换快速的时间响应!对于re ...

  2. NodeJS系列~第一个小例子,实现了request.querystring功能

    返回目录 百度百科上: Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始,在Node中,Http是首要的.Node为创建http服务器作了优化,所以在网上 ...

  3. ASP.NET Web API 2框架揭秘

    ASP.NET Web API 2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著   ISBN 978-7-121-23536-8 2014年7月出版 定价:108.0 ...

  4. C#并行编程-Parallel

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  5. salesforce 零基础学习(三十一)关于LookUp字段点击Save时的Validation

    今天在群里大概遇到了这样一个问题,明明这个User存在,但是save的时候提示信息说Value不存在,大概的意思如下图所示,目前认为这种问题常见的可能情况有两种. 一.此字段设置Validation ...

  6. JavaScript 模板引擎实现原理解析

    1.入门实例 首先我们来看一个简单模板: <script type="template" id="template"> <h2> < ...

  7. 解析大型.NET ERP系统 20条数据库设计规范

    数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到.当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考.在程序框架中,也有一份强制性的约定,当不遵守规范时报错 ...

  8. Objective-C中@property的所有属性详解

    1,assign : 简单赋值,不更改索引计数 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a 和b指 ...

  9. JAVA设计模式《四》

    经过前几篇的介绍相信大家对JAVA的设计模式一定有所解了,本篇我们再一起学习一下适配器模式.代理模式和工厂模式. 适配器模式使用的场景非常多,例如现实生活中,我们的笔记本电脑的充电线大部分都是三向插头 ...

  10. (转)Shell函数

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.  函数 ...