接續先前的基本範例,接著要來練習怎麼接收帶入extension的參數:
zend_parse_parameters方法
zend_parse_parameters提供不同的接收變數的方式,
變數1: ZEND_NUM_ARGS() TSRMLS_CC, 二個值中間是空白,ZEND_NUM_ARGS表示傳入參數的個數
變數2: 傳入變數的格式化字串
變數格式化字串
範例一: 接收字串
PHP_FUNCTION(foo_hello_str) {
// ZEND_NUM_ARGS =>參數的個數
char *name;
int name_len;
//parse parameters
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name,&name_len ) == FAILURE) {
RETURN_FALSE;
}
// php_printf("%s",name);
RETURN_STRINGL(name,name_len,1);//字串要多補一個結尾長度
}
範例二: 接收Array
PHP_FUNCTION(foo_hello_arr) {
zval *arr, **data;
HashTable *arr_hash;
HashPosition pointer;
int array_count;
//parse parameters
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &arr ) == FAILURE) {
RETURN_FALSE;
}
arr_hash = Z_ARRVAL_P(arr);
array_count = zend_hash_num_elements(arr_hash);
php_printf("The array passed contains %d elements ", array_count);
//for each
for(zend_hash_internal_pointer_reset_ex(arr_hash, &pointer);
zend_hash_get_current_data_ex(arr_hash,
(void**) &data, &pointer) == SUCCESS;
zend_hash_move_forward_ex(arr_hash, &pointer)) {
zval temp;
char *key;
int key_len;
long index;
if (zend_hash_get_current_key_ex(arr_hash, &key, &key_len, &index, 0, &pointer) == HASH_KEY_IS_STRING) {
PHPWRITE(key, key_len);
} else {
php_printf("%ld", index);
}
php_printf(" => ");
temp = **data;
zval_copy_ctor(&temp);
convert_to_string(&temp);
PHPWRITE(Z_STRVAL(temp), Z_STRLEN(temp));
php_printf(" ");
zval_dtor(&temp);
}
RETURN_TRUE;
}

沒有留言:
張貼留言
留個話吧:)