PHP擴展:zend_parse_parameters() 獲取字符串的問題

背景不多介紹了,能查到這個問題的基本都知道是怎麼回事了。

不說獲取其他類型參數的問題,網上一查一大堆。這裏只說一下獲取字符串。

下面是獲取單個字符串變量的方法:

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苦手來說,寫個擴展還真有點捉急。

希望能幫助遇到同樣坑的小夥伴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章