Zend Parameters Parser新增型別描述符介紹
阿新 • • 發佈:2018-12-23
從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”來申明我要得到一個數組, 那麼如上的物件, 就可以直接作為合法引數使用了.