PHP变量在zend内核中的存储方式

WBOY
Release: 2016-06-23 13:29:32
Original
948 people have browsed it

PHP中的变量可以保存任何的数据类型,这是因为它是弱类型语言。但php是用C语言编写的,C语言是强类型语言,每个变量都有固定的类型,不能随意改变变量的类型(可以通过强制类型转变,不过有可能出现问题),在zend引擎中是怎样可以做到一个变量保存任何类型的呢?
在zend/zend.h头文件中,会发现下面的结构体:

typedef struct _zval_struct zval;typedef union _zvalue_value {    long lval;    double dval;    struct {        char *val;        int len;    }str;    HashTable *ht;    zend_object_value obj;} zvalue_value ;struct _zval_struct {    zvalue_value value;    zend_uint refcount;    zend_uchar type;    zend_uchar is_ref;};
Copy after login

zval结构体就是通常用到的PHP变量在内核中的表达方式。在zval结构体中,可以看到4个成员变量,分别是:

zvalue_value value;  //变量的值,PHP变量的值就保存在这里zend_uint refcount;  //变量引用数,变量引用计算器zend_uchar type;     //变量的类型zend_uchar is_ref;   //变量是否被引用
Copy after login

zval结构体的value成员变量是一个zvalue_value联合体,PHP能够保持任何的结构类型就是因为这个联合体 。从zvalue_value联合体的成员变量中可以看到,不同类型会保存到不同的成员变量中,这样就实现了PHP变量可以存储任何数据类型。例如,当变量是整数类型时,会保存到value的lval成员变量中;当变量的类型是字符串时,又会保存到value的str成员变量中。


还有一个问题,就是zend引擎是怎么知道这个变量保存的是什么类型呢?我们注意到,zval结构体中有个type成员变量,这个成员变量就是要保存一个php变量的类型。
zend引擎定义了8中变量类型:

#define IS_NULL 0#define IS_LONG 1#define IS_DOUBLE 2#define IS_STRING 3#define IS_ARRAY 4#define IS_OBJECT 5#define IS_BOOL 6#define IS_RESOURCE 7
Copy after login

每一个宏定义对应php语言层的一种类型,例如当zval的type成员变量等于IS_STRING时(zval.type==IS_STRING),说明这个变量的类型是字符串类型。

版权声明:本文为博主原创文章,未经博主允许不得转载。

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template