本节书摘来自华章出版社《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的类型检查器可以接受的类型