背景不多介紹了,能查到這個問題的基本都知道是怎麼回事了。
不說獲取其他類型參數的問題,網上一查一大堆。這裏只說一下獲取字符串。
下面是獲取單個字符串變量的方法:
PHP_FUNCTION(confirm_bitch_compiled)
{
char *arg = NULL;
int arg_len, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
len = spprintf(&strg, 0, "Con! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "bitch", arg);
RETURN_STRINGL(strg, len, 0);
}
其實上面就是編寫 PHP擴展給的例子,很簡單,也很好理解。
下面說一下獲取多個字符串參數:
PHP_FUNCTION(hello_bitch)
{
char *a = NULL;
char *b = NULL;
int a_len, b_leng, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &a, &a_len, &b, &b_leng) == FAILURE) {
return;
}
len = spprintf(&strg, 0, "Hello %.78s biaaaatch %.78s ", a, b);
RETURN_STRINGL(strg, len, 0);
}
看到區別了麼。
簡單講解一下。
zend_parse_parameters()
本身是用來獲取從 PHP 傳遞到擴展中的參數的,但是獲取字符串的時候,要注意,寫法應該是
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss...", &a, &a_len, &b, &b_leng, ...)
這樣的,就是說,每個字符串都要有一個接收變量,還要有一個接收字符串長度的變量。
其實也就是字符串特殊一些,其他的類型就不用這樣了,直接一個接收變量就可以了。
可能這在C語言裏面是很基礎的東西吧,可是對我這樣的C苦手來說,寫個擴展還真有點捉急。
希望能幫助遇到同樣坑的小夥伴。