mydeer
就像我们从来没有来过这里,但这种感觉似曾相识。
PHP变量的结构和类型

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_object,IS_RESOURCE,IS_CONSTANT,IS_CONSTANT_ARRAY,
从字面意思就很好理解了,他们是类型的唯一标示,根据类型的不同,那么存储的值也对应不同的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定义的结构体,会保证一个变量只有一个值,这里只是列举形式可能有这么多。其实只有一个值的。

<< 上一篇 管道是什么,如何使用之C实现管道的通信 如何编写 PHP 扩展 之 我的第一个PHP扩展 下一篇 >>
文章标签
随意 | Created At 2014 By William Clinton | 蜀ICP备14002619号-4 |