天天看點

《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的類型檢查器可以接受的類型