PHP 虽然是弱类型语言,但是这并不意味着 PHP 的变量没有类型
PHP 变量的类型共有 8 种,可以分为以下三类标量类型 -- boolean、integer(long)、float(double)、string
复合类型 -- array、object
特殊类型 -- resource、NULL
PHP 的变量存储在 zval 结构体中,定义于 Zend/zend.h 文件中
// struct _zval_struct
// php 变量描述结构 {{{
struct _zval_struct {
/* Variable information */
zvalue_value value;/* value */// 变量值
zend_uint refcount__gc;// 引用计数
zend_uchar type;/* active type */// 变量的具体类型
zend_uchar is_ref__gc;// 是否为引用
}; // }}}
变量的值存储在一个联合体中:
// union 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;
zend_ast *ast;
} zvalue_value; // }}}
_zval_struct 的 type 字段存储了变量类型的唯一标识,他的值与实际的变量类型有一个对应关系
在 _zvalue_value 中,我们可以看到,integer 是使用 long 类型存储的,而浮点类型则是以 double 来存储的,array 是以 php 实现的哈希表 HashTable 结构来存储的,object 则是以 zend_object_value 结构来存储的