PHP的扩展如何返回一个结构体或者对象?

bandaoyu 2018-01-30 04:38:54

我写了一个PHP的扩展函数,需要返回值,返回的值有多个,所以我想返回一个结构体或者一个对象给调用的PHP

如果能返回的是结构体,那PHP端应该怎么接?
如果不能返回结构体,返回一个对象PHP端怎么接?



//多针消息结构体
typedef struct tagST_MUITI_FRAME_INFO
{
uint32 lAllDataSize; //数据总大小
uint16 unPacketNum; //拆分数据包个数
uint16 unPacketIndex; //拆分数据包索引,起始值为0
uint16 unPacketSize; //拆分数据包大小
uint16 unRsv; //预留
}ST_MUITI_FRAME_INFO;

//协议数据结构体
typedef struct tagST_MESSAGE_INFO
{
int32 lMsgID; //消息ID
int32 lMsgLen; //消息长度
int8 cFrameType; //0:单帧,1:多帧
int8 acRsv[31];
ST_MUITI_FRAME_INFO stMultiFrameInfo;
int8 acMsgBuff[0];

}ST_MESSAGE_INFO;



PHP_FUNCTION(GetMessageData)
{

char *pcSegData = NULL;
size_t lStrLen = 0;
size_t lSegDataLen = 0;
size_t lMessageInfoLen = 0;

zval *param;
zval *Message;
zval retval;

// zend_object *

ST_MESSAGE_INFO *pstMessageInfo = NULL;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "slz",&pcSegData,&lSegDataLen,¶m) == FAILURE) {
return;
}

lMessageInfoLen = sizeof(ST_MESSAGE_INFO) + lSegDataLen;

pstMessageInfo = (ST_MESSAGE_INFO*)malloc(lMessageInfoLen);

if (NULL == pstMessageInfo)
{
printf("malloc failed! in %s\n",__FUNCTION__);
goto end;
}


end:

RETURN_ZVAL(&retval, 0, 1); //这里我不只要返回一个值,我想返回多个值(一个结构体或对象)


}
...全文
1049 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bandaoyu 2018-02-02
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
不知道可以下个 php 是用户手册,每个函数都有类 C 形式的原型说明 php 没有 C 语言的结构(struct),所以你不可能将结构返回给 php php 中的 数组和对象是可以互换的,所以返回 数组和返回对象是一样的 你已经在写 php 扩展了,显然你已经知道,php 的变量管理是通过变量表进行的了
PHP 用户手册里面没有看到 类 C 形式的原型说明 ,请问在哪一章? 我是PHP7 手册
xuzuning 2018-02-02
  • 打赏
  • 举报
回复
睁眼瞎?这样的说明不是和 C 的原型声明很类似吗? array array_diff_key ( array array1, array array2 [, array ...] ) bool usort ( array &array, callback cmp_function ) array range ( mixed low, mixed high [, number step] )
bandaoyu 2018-02-01
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
不知道可以下个 php 是用户手册,每个函数都有类 C 形式的原型说明 php 没有 C 语言的结构(struct),所以你不可能将结构返回给 php php 中的 数组和对象是可以互换的,所以返回 数组和返回对象是一样的 你已经在写 php 扩展了,显然你已经知道,php 的变量管理是通过变量表进行的了
我真的不会。我希望更动的人来做,我毕竟不在行,我做这个事情的产出和远不如我做我自己在行的。我希望“外包”出去。版主可以帮我修改标题 前面加 悬赏200元求助 吗? 帖子第一句话 加 有会的请私信我,200元报酬。
xuzuning 2018-01-31
  • 打赏
  • 举报
回复
他的源码就是规矩,照套就可以
bandaoyu 2018-01-31
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
你得按人家的规矩来,而不能自己随心所欲
没有找到相关的例子,所以没办法按规矩呢,你有相关的例子吗?
xuzuning 2018-01-31
  • 打赏
  • 举报
回复
你得按人家的规矩来,而不能自己随心所欲
xuzuning 2018-01-31
  • 打赏
  • 举报
回复
不知道可以下个 php 是用户手册,每个函数都有类 C 形式的原型说明 php 没有 C 语言的结构(struct),所以你不可能将结构返回给 php php 中的 数组和对象是可以互换的,所以返回 数组和返回对象是一样的 你已经在写 php 扩展了,显然你已经知道,php 的变量管理是通过变量表进行的了
bandaoyu 2018-01-31
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
他的源码就是规矩,照套就可以
我对PHP 不熟悉,我从来没有做过PHP 我是C工程师,最近给一个PHP 的人(水平比较差)做一个C扩展需要用到的,所以我不知道哪个源码里函数可以参考,可否指点
bandaoyu 2018-01-30
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
返回对数组应该比较容易,比如 array_clice 函数就是返回数组的
是呀 我查到的例子都是 返回数组的。但是我返回的东西又不是数组,而是一个缓冲区和几个参数。你的意思是让我把这些放到数组里面返回?
xuzuning 2018-01-30
  • 打赏
  • 举报
回复
返回对数组应该比较容易,比如 array_clice 函数就是返回数组的

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧