<% dim ModuleName,InfoID,ChannelShortName,CorrelativeArticle,InstallDir,ChannelDir,Keyword,PageTitle,ArticleIntro,Articlecontent Keyword=stripHTML("参数,开发") PageTitle=stripHTML("PHP扩展开发中返回ZVAL类型的数据") ArticleIntro=stripHTML("PHP扩展开发中返回ZVAL类型的数据,有许多函数在php手册里把参数或返回值类型写为mixed。那么在扩展中是如何处理的呢?所谓mixed往往就是直接解析会返回zval。先看参数处理,zend_pa") Articlecontent=stripHTML("有许多函数在php手册里把参数或返回值类型写为mixed。那么在扩展中是如何处理的呢?所谓mixed往往就是直接解析会返回zval。先看参数处理,zend_pa…") ModuleName = stripHTML("programme") InfoID = stripHTML("206327") ChannelShortName=stripHTML("编程") InstallDir=stripHTML("http://www.77169.com/") ChannelDir=stripHTML("programme") %> PHP扩展开发中返回ZVAL类型的数据 - 华盟网 - http://www.77169.com
您现在的位置: 华盟网 >> 编程 >> PHP编程 >> 正文

PHP扩展开发中返回ZVAL类型的数据

2016/2/25 作者:不祥 来源: 互联网
导读 <% if len(ArticleIntro)<3 then Response.Write Articlecontent 'Response.Write "Articlecontent" else Response.Write ArticleIntro 'Response.Write "ArticleIntro" end if %>

有许多函数在php手册里把参数或返回值类型写为mixed。那么在扩展中是如何处理的呢?所谓mixed往往就是直接解析会返回zval。

先看参数处理,zend_parse_parameters:

zval* item;

zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “z”, &item);

这很简单。

然后看返回值,返回zval可以用RETURN_ZVAL宏。和前面的RETURN_LONG之类不同的是,这个宏有3个参数。第一个参数就是一个zval*。第二个和第三个参数都是0、1值。第二个参数是表示是否在返回前复制该值;第三个参数是表示在返回前是否调用析构函数。通常的用法是RETURN_ZVAL(p_zval, 1, 0);。为什么一般要把复制zval设为1呢?这和php的内存管理有关,因为php的垃圾回收是基于引用计数的。如果不复制一份,在函数结束后,因为返回值也是一个zval的指针,结束后php会把这个zval的引用计数-1,在一般情况下,这就会导致释放掉不该释放掉的内存,造成错误。