接續先前的基本範例,接著要來練習怎麼接收帶入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; }
沒有留言:
張貼留言
留個話吧:)