除了幾個"預覽"的例外, 你迄今處理的擴展函數都很簡單, 只有返回. 然而, 多數函數並非只有一個目的. 你通常會傳遞一些參數, 並希望接收到基於值和其他附加處理的有用的響應.
zend_parse_parameters()的自動類型轉換
和上一章你看到的返回值一樣, 參數的值也是圍繞著對zval引用的間訪展開的. 獲取這些zval*的值最簡單的方法就是使用zend_parse_parameters()函數.
調用zend_parse_parameters()幾乎總是以ZEND_NUM_ARGS()宏接著是無所不在的TSRMLS_CC. ZEND_NUM_ARGS()從名字上可以猜到, 它返回int型的實際傳遞的參數個數. 由於zend_parse_parameters()內部工作的方法, 你可能不需要直接了解這個值, 因此現在只需要傳遞它.
zend_parse_parameters()的下一個參數是格式串參數, 它是由Zend引擎支持的基礎類型描述字符組成的字符序列, 用來描述要接受的函數參數. 下表是基礎的類型字符:
zend_parse_parameters()剩下的參數依賴於你的格式串中所指定的類型描述. 對於簡單類型, 直接解引用為C語言的基礎類型. 例如, long數據類型如下解出:
PHP_FUNCTION(sample_getlong) { long foo; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &foo) == FAILURE) { RETURN_NULL(); } php_printf("The integer value of the parameter you " "passed is: %ld\n", foo); RETURN_TRUE; }
盡管integer和long的存儲空間通常是一樣大的, 但它們並不完全一致. 嘗試將一個int類型的數據解引用到long *參數可能會帶來不期望的結果, 尤其是在64位平台上更加容易出錯. 因此, 請嚴格使用下表中列出的數據類型.