PHP拓展开发 - 扩展函数的传参

参考原文:
https://blog.csdn.net/u011957758/article/details/72513935

1、zend_parse_parameters

如果你实际操作中看了PHP_FUNCTION(confirm_helloworld_compiled)中的内容,就会发现这个函数,它的作用就是接收参数,可以类比PHP的sscanf()

zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, &参数1,&参数2…);
  • 第一个参数是传递给函数的参数个数
  • 第二个参数是为了线程安全,总是传递TSRMLS_CC宏。关于TSRMLS_CC,感兴趣的小伙伴可以阅读下鸟哥的博客揭秘TSRM
  • 第三个参数是一个字符串,指定了函数期望的参数类型,后面紧跟着需要随参数值更新的变量列表。由于PHP是弱类型语言,采用松散的变量定义和动态的类型判断,而c语言是强类型的,而zend_parse_parameters()就是为了把不同类型的参数转化为期望的类型。(当实际的值无法强制转成期望的类型的时候,会发出一个警告)
    使用示例
    zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",&name, &name_len)
PHP拓展开发 - 扩展函数的传参_第1张图片
参数表

PHP拓展开发 - 扩展函数的传参_第2张图片
额外用法
  • 第四第五直到第n个参数,都是要传进来的值的数值。

2、zend_get_arguments

ZEND_FUNCTION(my_function) {
    zval *email;
    if (zend_get_parameters(ZEND_NUM_ARGS(), 1, &email)== FAILURE) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING,"至少需要一个参数");
        RETURN_NULL();
    }
    // ... 
}
1.能够兼容老版本的PHP,并且只以zval为载体来接收参数。 
2.直接获取,而不做解析,不会进行类型转换,所有的参数在扩展实现中的载体都需要是zval类型的。 
3.接受失败的时候,不会自己抛出错误,也不能方便的处理有默认值的参数。 
4.会自动的把所有符合copy-on-write的zval进行强制分离,生成一个崭新的copy送到函数内部。

综合评价:还是用zend_parse_parameters吧,这个函数了解下即可,不给力。

3、zend_get_parameters_ex()

ZEND_FUNCTION(my_function) {
    zval **msg;
    if (zend_get_parameters_ex(1, &msg) == FAILURE) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING,"至少需要一个参数");
        RETURN_NULL();
    }
    // ...
}
1.不需要ZEND_NUM_ARGS()作为参数,因为它是在是在后期加入的,那个参数已经不再需要了。
2.此函数基本同zend_get_parameters()。 
3.唯一不同的是它不会自动的把所有符合copy-on-write的zval进行强制分离,会用到老的zval的特性
综合评价:极端情况下可能会用到,这个函数了解下即可。

4、zend_get_parameters_array_ex()和zend_get_parameters_array()

//程序首先获取参数数量,然后通过safe_emalloc函数申请了相应大小的内存来存放这些zval**类型的参数。这里使用了zend_get_parameters_array_ex()函数来把传递给函数的参数填充到args中。 
//这个参数专门用于解决像php里面的var_dump的一样,可以无限传参数进去的函数的实现

ZEND_FUNCTION(var_dump) {
    int i, argc = ZEND_NUM_ARGS();
    zval ***args;

    args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0);
    if (ZEND_NUM_ARGS() == 0 || zend_get_parameters_array_ex(argc, args) == FAILURE) {
        efree(args);
        WRONG_PARAM_COUNT;
    }
    for (i=0; i

以上

欢迎大家关注我的公众号


PHP拓展开发 - 扩展函数的传参_第3张图片
半亩房顶

你可能感兴趣的:(PHP拓展开发 - 扩展函数的传参)