众所周知,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保存的是变量的值。这里用到了另一个联合体:
typedef union _zvalue_value {long lval; /* long value */double dval; /* double value */struct {char *val;int len;} str;HashTable *ht; /* hash table value */zend_object_value obj;} zvalue_value;
从zvalue_value;联合体看出,不同类型的变量值会保存在联合体的相应成员变量中,比如整数的值会保存在lval中,字符串会保存在str中......现在轮到开头那一串定义的常量出场了, zend_uchar type; 这里保存的是变量的类型,也就是当type==IS_STRING时,说明这个联合体所保存的变量是字符串类型,即字符串值存储在联合体的str中。