标签 变量 下的文章

编程语言的类型可分为强类型和弱类型两种,强类型变量声明时已确定变量类型,运行过程中不能随便将其他类型变量赋值于它(涉及到类型强制转换等除外),C/C++/Java属于强类型语言;而PHP/Python/JS属于弱类型语言,变量可以表示任意类型。本文介绍PHP变量的内部实现数据结构,如何表示各种数据类型。

1、PHP变量类型及存储结构
PHP虽然是弱类型语言,我们在使用时也会指明它的类型,比如bool/array/object/resource/null等。PHP底层使用C语言实现,变量的值存储到以下所示zval结构体中:

typedef struct _zval_struct zval;
struct _zval_struct {
    zvalue_value value;         /* 存储变量的值 */
    zend_uint refcount__gc;     /* 表示引用计数 */
    zend_uchar 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 */
    double dval;                /* double */
    struct { 
        char *val;
        int len;
    } str;                      /* string*/
    HashTable *ht;              /* hash table */
    zend_object_value obj;      /* object */
} zvalue_value;

PHP的弱变量容器的实现方式是兼容并包的形式体现,针对每种类型的变量都有其对应的标记和存储空间。 使用强类型的语言在效率上通常会比弱类型高,因为很多信息能在运行之前就能确定,这也能帮助排除程序错误。 而这带来的问题是编写代码相对会受制约。

- 阅读剩余部分 -