菜鸟学php扩展 之 详解php扩展的变量(四)

本文详细介绍了PHP扩展中变量的结构、类型、检测、存储、赋值、查找、类型转换以及内存管理。重点讨论了zval结构体、HashTable在变量存储中的作用,以及如何使用内核API进行变量操作。通过示例代码,帮助读者理解PHP扩展中变量的生命周期和内存管理策略。
摘要由CSDN通过智能技术生成

转载请附上本文地址: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 **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值