PHP在声明或者使用变量的时候,不需要显式指定数据类型,但是PHP中依然是有类型这一概念的。
PHP中的类型分为三类:
(1)标量类型:boolean、integer、float、string
(2)复合类型:array、object
(3)特殊类型:resource、NULL
PHP中变量的值是存储在名为zval的结构体中的,
typedef struct _zval_struct zval;
...
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value 存储变量的值*/
zend_uint refcount__gc; 引用计数
zend_uchar type; /* active type */变量具体的类型
zend_uchar is_ref__gc; 是否为引用变量
};
其中type的值可以为:IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT、IS_RESOURCE。
变量的实际值存储在zvalue_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;
从中我们也可以发现,php记录了string类型变量的长度,因此strlen可以在常数时间内获得字符串的长度。
数组类型的变量是存储在hashtable中的,
对象类型的变量使用了一种名为zend_object_value的结构体来存储,
typedef struct _zend_object_value {
zend_object_handle handle; // unsigned int类型,EG(objects_store).object_buckets的索引
zend_object_handlers *handlers;
} zend_object_value;