文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-02-27 19:43

关注

多个参数


在内核开发中,在接收用户传入的参数的过程中,可以使用 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);

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯