变量具有三个基本组成部分:
1、名称 变量的标示符。就像小狗一样,主人可能会给这些小狗起个喜欢的名称。变量命名上,PHP继承了Perl的语法风格,变量以美元符号开始,后面跟变量名。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。 PHP同时还支持复合变量,也就是类似$$a的变量,它会进行两次的解释。这给PHP带来了非常灵活的动态特性。
2、类型 变量的类型,就像小狗的品种,牧羊犬、拉布拉多犬、中华田园犬等等。在很多静态语言中,变量在定义时就指定了,在程序运行过程中都不允许进行变更。但对于像PHP属于弱类型的动态语言中,可以随便赋予它任何类型的值。
3、值内容。这是标示所代表的具体内容。这就像是实实在在的小狗的这个实物。你可以给任何一条小狗起名为:小黄,在编程语言中也是如此,你可以给变量赋予它所能表示范围的值。不过在同一时间,变量只能有一个值。
①PHP中的变量是通过zval结构体来实现的,zval结构体定义在Zend/zend.h文件,其结构如下:
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;
};
其中refcount__gc表示引用计数,默认值为1;
is_ref__gc表示是否引用,默认值为0;
value表示存储变量的具体的值;type表示变量的具体类型,
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的boolean、integer、resource类型可以通过lval字段来存储;
float(double)类型可以通过dval字段存储;
string类型通过str字段存储;array类型用ht字段存储;
object类型用obj字段存储;
NULL类型的变量值不需要存储,只需要把(zval).type标为IS_NULL。