1. 程式人生 > >Zend Parameters Parser新增型別描述符介紹

Zend Parameters Parser新增型別描述符介紹

從PHP5.3開始, zend_parse_paramters_*函式新增瞭如下幾個新的型別描述符:

f  - function or array containing php method call info (returned as
      zend_fcall_info and zend_fcall_info_cache)
H  - array or HASH_OF(object) (returned as HashTable*)
L  - long, limits out-of-range numbers to LONG_MAX/LONG_MIN (long)
Z  - the actual zval (zval**)
*  - variable arguments list (0 or more)
+  - variable arguments list (1 or more)

這也使得我們做擴充套件開發的時候, 能更加輕鬆的處理輸入引數, 得到想要的值.

比如沒有f之前, 如果我們擴充套件中提供一個方法, 接受使用者傳入的一個回撥函式, 那我們需要對使用者傳入的引數做判斷:

1. 是字串還是陣列
2. 如果是字串, 那麼是否是一個可呼叫的回撥函式
3. 如果是陣列, 那麼就分為, 呼叫類的靜態方法, 和一個物件的方法倆種情況.
    並驗證他們是否是可呼叫的回撥函式.

這個挺麻煩的吧? 而有了f, 我們就可以簡單的:

PHP_FUNCTION(dummy) {
    zval *retval_ptr = NULL;
    zend_fcall_info fci;
    zend_fcall_info_cache fci_cache;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
            "f*", &fci, &fci_cache, &fci.params, &fci.param_count) == FAILURE) {
        return;
    }

    fci.retval_ptr_ptr = &retval_ptr;

    zend_call_function(&fci, &fci_cache TSRMLS_CC);
    .....
}

是不是方便了很多呢?

另外, 上面的例子也順便介紹了”*”, 這個主要用來方便可變引數函式的開發. “+”也類似.

最後要說的就是”H”.

首先我們要說說PHP的一些歷史原因, 導致PHP的物件, 其實也可以作為陣列來使用, 這個時候預設的它的屬性就會作為陣列載體.

這樣, 當我們在擴充套件中的一個函式中申明要得到一個數組, 對於如下的object, 就無法直接呼叫:

$person = new StdClass();
$person->name = "Laruence";
$person->age   = 28;

而如果我們在擴充套件的函式中使用”H”來申明我要得到一個數組, 那麼如上的物件, 就可以直接作為合法引數使用了.