php扩展开发:参数,数组,以及ZVAL

介绍

在这个系列教程的第一部分,你已经了解了一个PHP扩展的基本框架结构。你声明了一个简单的函数,这个函数向调用它的脚本返回静态和动态的值,定义了INI配置项,以及声明了内部的值(全局变量)。在这个教程中,你将会知道如何接收传递到你函数中的参数,并且认识到PHPZend Engine在内部是如何管理变量的。

接收参数

不像在用户空间的代码那样,一个内部函数的参数实际上不会声明在函数的头部。相反,参数列表的引用会传递到每个函数中 – 不管参数传递了没有 – 接下来函数就可以让Zend Engine把这些参数变成可以使用的变量。

继续阅读

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

有许多函数在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,在一般情况下,这就会导致释放掉不该释放掉的内存,造成错误。