PHP的类型,我没看到定义类型呀,他也有数据类型么?
PHP是弱类型语言,并不表示PHP没有类型。
那么PHP的变量都有哪些类型呢?
PHP中存在8中类型,分为三类:
标量类型:boolean、integer、float(double)、string
符合类型:array、object
特殊类型:resource、NULL
ZEND PHP使用C是实现的,C是强类型的语言,PHP的变量如何存储,又如何实现弱类型,我们看看Zend的源码:
PHP的变量存储在zval里面,在php的源码下 Zend/zend_types.h下定义了
typedef struct _zval_struct zval;
其中 _zval_struct 声明了变量的结构体在 Zend/zend.h 中可以看到:
struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ //变量的真正值 zend_uint refcount__gc; // 值被引用的次数 默认 1 zend_uchar type; /* active type */ // 类型 zend_uchar is_ref__gc; // 是否为引用 默认 0 };
PHP使用这个结构来存储变量的所有数据,zval结构体有四个属性,我已简单标注,具体代表什么意思:
is_ref__gc 是否为引用,默认为0。如$a = &$b 那么表示$a是引用$b的值,这里$a 为 1
refcount__gc 值被引用的次数,默认为1。可以说是一个cow的属性,当前变量的值被其他变量引用的时候,此数累加。如 $a = $b,那么$b的此属性为2,因为被$a引用了此值。
type 变量的类型,此属性就是实现弱类型的关键字段,它可以为以下值之一:IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_ob
从字面意思就很好理解了,他们是类型的唯一标示,根据类型的不同,那么存储的值也对应不同的value属性,接下来看看value属性。
zvalue_value value 变量的值,为一个结构体,也在 Zend/zend.h 中定义了:
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;
很多同学问为什么这么多值,变量不是只有一个值么,这就是c的 union艺术了,使用union定义的结构体,会保证一个变量只有一个值,这里只是列举形式可能有这么多。其实只有一个值的。