转载请附上本文地址:http://blog.csdn.net/u011957758/article/details/72633938
前言
经过前文 菜鸟学php扩展 之 详解扩展函数的传参(如何获取参数)(三) ,基本上已经明白了php调用扩展时候,按道理应该要是来记录一下,如何返回结果的。但是突然总结时候发现,结果的返回之前必须要记录一下php扩展的变量相关知识点,这样更好理解如何返回结果,毕竟返回的结果基本都是变量。
正文
变量的结构与类型
PHP在内核中是通过zval这个结构体来存储变量的,所以写扩展的时候当然也是一样。
在Zend/zend.h文件中找到了其定义:
struct _zval_struct {
zvalue_value value; /* 变量的值 */
zend_uint refcount__gc;
zend_uchar type; /* 变量当前的数据类型 */
zend_uchar is_ref__gc;
};
**快速理解:为方便起见可以直接把zval结构体理解成一个由value、type、refcount__gc、is_ref__gc组成的对象就好了,*__gc是管理内存相关的时候会用到的,这里可以先不管。 **
基于zval结构体,衍生出了8种数据类型。也就是php语言对应的8种类型,这些数据类型在内核中的分别对应于特定的常量:
常量 | 解释 |
---|---|
IS_NULL | 变量的默认类型,此类型值只有一个就是NULL,不同于0和false。 |
IS_BOOL | 布尔类型的变量,有两个值:true和false。 |
IS_LONG | PHP语言中的整型,内核中是通过所在操作系统的signed long数据类型来表示的。 32位操作系统中,可存储-2147483648 到 +2147483647范围内的任一整数。如果PHP语言中的整型变量超出范围,它并不会直接溢出,而是会被内核转换成IS_DOUBLE类型的值然后再参与计算。同时也解释了PHP语言中的整型数据都是带符号的缘由。 |
IS_DOUBLE | PHP中的浮点数据,内核中是通过操作系统的signed double型变量来存储的。这个浮点数是有坑存在的,附上鸟哥亲自解释的坑。点这里 |
IS_STRING | PHP中的字符串类型,PHP内核在zval结构里保存着这个字符串的值与实际长度。 |
IS_ARRAY | 数组类型,它唯一的功能就是聚集别的变量。由于是基于HashTable实现的,所以可以存储任意类型的变量,每个HashTable中的元素都有两部分组成:索引与值,每个元素的值都是一个独立的zval(确切的说应该是指向某个zval的指针)。 |
IS_OBJECT | 对象类型,和数组一样,也是用来存储复合数据的,但是与数组不同的是,对象还需要保存以下信息:方法、访问权限、类常量以及其它的处理逻辑。 |
IS_RESOURCE | 资源类型,存储一些内容可能无法直接呈现给PHP用户的,但实际中却是需要的东西,比如与某台mysql服务器的链接,或者直接呈现出来也没有什么意义的东西。 |
如何检测变量的类型和值
检测变量的类型
这几个宏都可以表示:Z_TYPE、Z_TYPE_P、Z_TYPE_PP。
区别是:一个p结尾的宏的参数大多是*zval型变量(指针),两个p结尾的宏参数大多是**zval型变量(指针的指针).
简单粗暴的程序表达:
void display_value(zval zv,zval *zv_p,zval **