您的位置:首页 > 编程语言 > PHP开发

php变量在内核中的存储方式

2015-02-21 17:22 621 查看
众所周知,php是使用c语言编写的,c语言是强类型的语言。而php是弱类型的语言,一个变量可以保存任何类型的值。那么这里就涉及到Zend引擎中的实现。

在php文件目录下的Zend/zend.h头文件中,可以看到类似的定义:

---------------------------------------------------------

#define IS_NULL   0
#define IS_LONG   1
#define IS_DOUBLE   2
#define IS_BOOL   3
#define IS_ARRAY   4
#define IS_OBJECT   5
#define IS_STRING   6
#define IS_RESOURCE   7
#define IS_CONSTANT   8
#define IS_CONSTANT_ARRAY   9
这是Zend引擎预先定义的几种变量类型,用来记录php变量所保存的值的类型。

-------------------------------------------------------

struct _zval_struct {

 /* Variable information */
 zvalue_value
value; /* value */
 zend_uint
refcount;
 zend_uchar
type; /* active type */
 zend_uchar
is_ref;
 };

这个结构体就是我们在php中用到的变量的通常表示形式(如$obj).

 zvalue_value
value;变量的值保存在这里

 zend_uint
refcount;变量引用数

 zend_uchar
type; 变量的类型

 zend_uchar
is_ref;变量是否被引用

在这里看到,zvalue_value
value保存的是变量的值。这里用到了另一个联合体:

[align=left]typedef union _zvalue_value {[/align]
[align=left]   long lval; /* long value */[/align]
[align=left]  double dval; /* double value */[/align]
[align=left]  struct {[/align]
[align=left]     char *val;[/align]
[align=left]     int len;[/align]
[align=left]  } str;[/align]
[align=left]  HashTable *ht; /* hash table value */[/align]
[align=left]  zend_object_value obj;[/align]
[align=left] } zvalue_value;[/align]

从zvalue_value;联合体看出,不同类型的变量值会保存在联合体的相应成员变量中,比如整数的值会保存在lval中,字符串会保存在str中......

现在轮到开头那一串定义的常量出场了,zend_uchar
type; 这里保存的是变量的类型,也就是当type==IS_STRING时,说明这个联合体所保存的变量是字符串类型,即字符串值存储在联合体的str中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 内核 结构 zend