迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

PHP内核开发,接收用户传入的参数

作者:迹忆客 时间:2021/06/10 浏览次数:

多个参数


在内核开发中,在接收用户传入的参数的过程中,可以使用 zend_parse_parameters()函数。具体使用可以参考 《extending and embeding PHP》 第七章--第一节但是在上述文章中介绍的参数类型和注意事项并不是特别全面,下面是我在开发中遇到的一个需要注意的地方,当然不只是下面这一个,后续还会根据在实际中的使用情况来更新。。。


一、'+' 指定的参数,以及接收参数的变量

我们知道接收参数可以使用zend_parse_parameters() 方法。该方法的第二个参数是用来指定参数类型的。例如:

specifier Userspace Datatype C Datatypesb Boolean zend_booll Integer longd Floating point doubles String char*,intr Resource zval*a Array zval*o Object instance zval*O Object instance of a specified type zval*,zend_class_entry*z Non-specific zval zval*Z Dereferenced non-specific zval zval**

我们看到,每个字符代表一个特定的数据类型。如下面代码指定了一个参数,这个参数是一个字符串类型。

 char *name;int name_len;if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",&name, &name_len) == FAILURE) {RETURN_NULL();}php_printf("Hello ");PHPWRITE(name, name_len);php_printf("!\n");

在看如下代码, 指定了两个参数,分别都是字符串类型(当然我们可以指定特定位置上的参数类型为其他的类型)

 char *name;int name_len;char *greeting;int greeting_len;if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",&name, &name_len, &greeting, &greeting_len) == FAILURE) {RETURN_NULL();}php_printf("Hello ");PHPWRITE(greeting, greeting_len);php_printf(" ");PHPWRITE(name, name_len);php_printf("!\n");

但是如果我们的函数并不确定有几个参数那我们应该使用什么指示符呢,了解正则表达式的肯定都知道两个特殊的字符 '*' 和 '+'。 '*'代表0到多个;'+'代表1到多个。所以如果我们定义的函数不确定有几个参数,但是肯定会有参数,那就使用'+', 那如果也可以没有参数,则可以使用'*'。 不过当使用这两个指示符的时候,对于我们定义的用来接收参数的变量也有特定的要求,需要使用 zval*** 来定义变量。而对于使用过的用来接收参数变量要在使用完之后释放掉,否则会在userspace调用该函数的时候报错。看如下代码:

 zval ***args = NULL;int i=0,argc; //用来接收参数的个数if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"+",&args,&argc) == FAILURE){return;}// 然后可以使用 for循环来遍历这些参数for(i = 0;i < argc; i++){// 判定参数的数据类型,从而进行相应的操作,这里我们使用数组作为例子if(Z_TYPE_PP(args[i]) == IS_ARRAY){php_printf("这是数组类型");}}// 释放参数变量,可以认为是必须使用efree(args);

上面就是在开发的过程中遇到的需要注意的地方,随着学习的继续,后续碰到的细节会继续在这记录下来。

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址:

迹忆客

专注技术分享,项目实战分享!

技术宅 乐于分享 7年编程经验
社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

热门文章

热门标签