天天看点

《Hack与HHVM权威指南》——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的类型检查器可以接受的类型