《Hack与HHVM权威指南》——1.3.2 函数的参数

本节书摘来自华章出版社《Hack与HHVM权威指南》一书中的第1章,第1.3.2节,作者 Owen Yamauchi,更多章节内容可以访问“华章计算机”公众号查看。

1.3.2 函数的参数

给函数的参数做类型标注的语法和PHP中使用类型提示参数的语法一致,都是把类型名称放在参数名之前。
function f(int $start, string $thing) {
// ...
}
参数的默认值也一如既往地被支持,但前提是默认值要符合类型标注。在PHP中这里对于类型提示参数特别允许设置默认值为null。所以下方的内容是有效的:
function f(SomeClass $obj = null) {
// ...
}
但是这种写法在Hack中是无效的,因为它混淆了可选参数的概念和允许一个占位值的必填参数的概念。在Hack中,可以通过把一个参数类型标记为nullable的方法来表述后者(参见1.4节)。
parameter(参数)和argument(参数)
这两个词在程序员的日常交流中经常交替使用。但是事实上,它们并不是同一个东西,这两者的区别是就像变量variable和值value的区别一样,parameter是变量,而argument是值,即一个函数被调用的时候,传递给变量的具体值。思考下面的代码:
function add_one($x) {
return $x + 1;
}
echo add_one(10);
$x是函数add_one的一个变量,而10就是一个赋给变量$x的值。
所以当我们说一个函数拥有(has)parameter的时候,正确的说法应该是它接受了argument,因为当你调用这个函数的时候,传递了argument给它。
可变参数函数
可变参数函数就是参数值数量不定的函数。在PHP中,所有的函数都是隐式的、参数可变的,传递给一个函数超过它规定参数之外多余的参数值并不会触发错误,并且任何函数都可以通过内置的func_get_args()、func_get_arg()和func_num_args()获得你传递给它的所有参数值。
与此相反的是,在Hack中传递过量的参数给一个函数将会触发一个错误,除非这个函数显式地声明为一个可变参数函数。Hack中创建一个可变参数函数的语法是,放置一个...到函数签名之中。在这样的函数之中,就像在PHP中一样,可以通过func_get_args()、func_get_arg() 以及func_num_args() 获得这些参数值。
function log_error(string $format, ...) {
$varargs = func_get_args();
// ...
}
可变参数允许是任意类型的,log_error()函数的第一个参数值必须是一个字符串,但是随后的参数值可以是任何Hack的类型检查器可以接受的类型

时间: 2024-11-04 00:53:57

《Hack与HHVM权威指南》——1.3.2 函数的参数的相关文章

《Hack与HHVM权威指南》——1.5.4 可变参数类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.4 可变参数类型 正如我们早期看到的一样,Hack拥有声明某个函数是可变参数的语法: function log_error(string $format, ...) { $args = func_get_args(); // ... } PHP 5.6介绍了一个不同的可变参数的语法,它有两个特性超过了Hack.

《Hack与HHVM权威指南》——第1章 类型检查

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 第1章 类型检查 类型检查器是Hack语言的标志特性,它对Hack程序静态地进行分析(不用运行它们),并且能够检查很多种错误.这就能够在程序开发初期尽量避免bug,并且使程序更容易阅读和理解.为了增强类型检查器的能力,Hack语言允许编程人员显式地在程序体中标注某些变量值的类型,比如函数参数.函数返回值和属性值,类型检

《Hack与HHVM权威指南》——1.7.1 提炼nullable类型到non-nullable类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.7.1 提炼nullable类型到non-nullable类型 null检查语句在从空值(nullable)的类型到非空值(non-nullable)类型的转变中经常用到.下面是个通过了类型检查器检查的示例. function takes_string(string $str) { // ... } functio

《Hack与HHVM权威指南》——1.5.1 使用超级全局变量

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.5.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.1 使用超级全局变量 超级全局变量是在每个代码范围内都存在的全局变量,不需要使用global语句即可使用.这些在运行环境中特殊存在的变量一共有9个,分别是: $GLOBALS $_SERVER $_GET $_POST $_FILES $_COOKIE $_SESSION $_REQUEST $_ENV

《Hack与HHVM权威指南》——1.5.3 属性值初始化

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.5.3节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.3 属性值初始化 为了维护类型安全,类型标注过的属性在初始化时,无论是严格模式还是局部模式,类型检查器会强加一些规则.首要目标就是确保属性值在没有初始化为正确类型的值之前,不能被读取. 对于静态的属性值,规则非常简单:任何不可为空的(non-nullable)的静态属性值都必须有一个初始化值.没有显式初

《Hack与HHVM权威指南》——1.4 Hack的类型系统

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.4节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.4 Hack的类型系统 Hack提供了一系列强有力的方法来描述类型,在PHP最基本的布尔型.整型.字符串型.数组等类型系统的基础上,添加了很多新的方式来结合它们,并且使之更富有表现力. 原始类型 这里有和PHP一样的原始类型:bool.int.float.string.array和resource,这些都是合法

《Hack与HHVM权威指南》——第1章 类型检查1.7 类型提炼

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.7节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.7 类型提炼 假设你有个?string类型的值,而且准备把这个值传递给一个参数类型为string的函数.那么你怎么把一个类型(?string)转化为另外一个类型(string)呢?或者假设你有个object类型的值,它可能实现或没有实现Polarizable接口.同时,如果它实现了这个接口,你还希望调用这个ob

《Hack与HHVM权威指南》——第2章 泛型2.1 入门实例

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第2章,第2.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 第2章 泛型 泛型在Hack的类型系统里面是个非常强大的特性,泛型可以允许你在不知道流程中传入的具体类型的情况下,写出类型安全的代码.一个类或者函数都可以是泛型的,这意味着它可以让调用者来选择传入的参数类型. 泛型结构体最好的例子就是数组和集合类(关于集合类的更多内容请参见第5章).不具备明确指出数组内容具体类型的

《Hack与HHVM权威指南》——1.2.1 自动加载一切

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.2.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.2.1 自动加载一切 类型检查器做出的一个关键假设就是,你的项目经过设置后,代码库中的任何类.函数或者常量都能够在你代码库的其他地方使用.不会尝试去分析任何include或者require语句,确保当前文件在使用时已经加载了其他文件.相反,它认为你已经完成了"自动加载"的相关设置.这就简

《Hack与HHVM权威指南》——1.4.1 类型检查器模式

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.4.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.4.1 类型检查器模式 Hack的类型检查器有三种模式:严格(strict).局部(partial)和耦合(decl).这些模式都基于一个个单独的文件,不同模式下的单独文件可以无缝地进行对接.每个文件可以单独声明它的类型检查模式,语法就是在文件的第一行使用一个双斜线的注释.如下面的代码所示:<?hh