給函數的參數做類型标注的文法和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的類型檢查器可以接受的類型