php变量在内核中的存储方式
2015-02-21 17:22
621 查看
众所周知,php是使用c语言编写的,c语言是强类型的语言。而php是弱类型的语言,一个变量可以保存任何类型的值。那么这里就涉及到Zend引擎中的实现。
在php文件目录下的Zend/zend.h头文件中,可以看到类似的定义:
---------------------------------------------------------
这是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/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 |
-------------------------------------------------------
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变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- PHP变量在zend内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- PHP变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- php变量在内核中的存储方式
- PHP源码分析-变量的存储方式
- PHP源码中变量存储方式
- 19.PHP内核探索:变量存储与类型