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. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  2. 浅谈iOS版本号

    作者:Travis FIR.im 一直在尽量兼容不同使用习惯的版本号形式, 但是在使用中我们发现好多开发者对怎么更好的用版本号来标示应用很陌生. 这是篇基础文章, 简单介绍 iOS 的版本号. 名词解 ...

  3. linux 学习 设置固定网Ip

    本人使用CentOs6.5 最近在学习linux操作系统,单在使用shell连接前都要使用ifconfig eth0 设置一个临时IP让我不胜其烦.决定学习设置一个固定IP 步骤: 1.登录计算机后使 ...

  4. js 四舍五入函数 toFixed(),小数位数精度

    js的加减乘除有时得到的结果的小数的位数非常大,这种结果非常难以读取,例如某两个数相乘得到的结果是:1.3921000000000001 这种结果小数的位数有点多,一般需要的结果是四舍无入的 1.39 ...

  5. MVC利用URLRoute实现伪静态

    routes.MapRoute(                    "Default", // Route name                    "{con ...

  6. 如何使用ITEXTSHARP将HTML代码字符串写进PDF

    原文 如何使用ITEXTSHARP将HTML代码字符串写进PDF itextsharp包括一个简单的类,可以用来根据html代码或字符串创建pdf文件.使用此类,你可以使用短短几行代码,就将 HTML ...

  7. html_01之基础标签

    1.嵌套规则:①行内不能嵌套块:②p不能嵌套块:③非布局元素不要嵌套div: 2.标准属性:①id:定义元素唯一名称(a.布局时用:b.JS用):②title:鼠标移入时提示的文字:③class:定义 ...

  8. CSS 框模型( Box module )

    框和布局 在 KB005: CSS 层叠 中已经介绍了 CSS 的重要之处.CSS 可以说是页面表现的基础, CSS 可以控制布局,控制元素的渲染. 布局是讲在电影画面构图中,对环境的布置.人物地位的 ...

  9. OpenCascade HLR for Pipe Model

    OpenCascade HLR for Pipe Model eryar@163.com 摘要Abstract:在工厂辅助设计(Plant Design)或船舶辅助设计(Ship Design)等CA ...

  10. 后端码农谈前端(CSS篇)第三课:选择器

    一.选择器 1.ID选择器: 语法:首先,ID 选择器前面有一个 # 号 - 也称为棋盘号或井号.请看下面的规则: *#intro {font-weight:bold;} 与类选择器一样,ID 选择器 ...