PHP作为一门弱类型语言,其变量类型可任意改变。而C作为PHP的底层实现,是通过结构及联合来实现PHP变量的弱类型特性的。在PHP源码中,Zend/zend.h文件有关于PHP变量的结构定义。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
typedef struct _zval_struct zval;
 
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;
 
struct _zval_struct {
    /* Variable information */
    zvalue_value value;     /* value */
    zend_uint refcount__gc;
    zend_uchar type;        /* active type */
    zend_uchar is_ref__gc;
};

PHP的变量值,存储于zvalue_value这个联合当中。从其定义可以看出PHP是如何实现单一变量支持不同类型的。lval实现整型及资源类型的存储,dval实现长整型或浮点型存储,str实现字符串的存储,ht是一个哈希表的指针,用于数组的实现,obj实现对象类型。
    再看看zval这个结构,zval是实现PHP变量存储机制的核心。包含四个成员,value是变量值,type表示变量的类型,为unsigned char类型,其值在内核中有对应的常量定义,分别对应PHP的八种数据类型。这八个常量是:IS_NULL, IS_BOOL, IS_LONG, IS_DOUBLE, IS_STRING, IS_ARRAY, IS_OBJECT, IS_RESOURCE。可见,根据type和value两个成员,即可实现PHP当中的八种变量类型。假如有以下PHP代码:

1
2
3
4
$a = 4323;
echo $a;
$a = "hello world";
echo $a;

运行第一句的时候,变量$a对应的zval结构当中的type成员值设置为IS_LONG,取值打印的时候就取value中的lval成员。然后运行第三句,将一个字符串赋值给变量$a,此时对应的zval结构的type成员值就被设置成了IS_STRING,然后取值的时候就根据value中的str结构的字符指针去获取字符串。

PHP内核变量存储的更多相关文章

  1. Java内存分配及变量存储位置实例讲解

    Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般 ...

  2. C语言基础--变量存储细节

      1.变量为什么要有类型? 每种类型占用的内存空间不一样 int 4, char 1 double 8 2.只要定义变量, 系统就会开辟一块存储空间给我们的变量存储数据, 内存寻址是从大到小 3.越 ...

  3. java+内存分配及变量存储位置的区别[转]

    原文来自:http://blog.csdn.net/rj042/article/details/6871030#comments Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Jav ...

  4. 局部变量存储区域静态变量存储区域static变量存储区域

    局部变量存储区域静态变量存储区域static变量存储区域 常见的存储区域可分为: 1.栈 由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 2.堆 ...

  5. 在C中判断变量存储类型(字符常量/数组/动态变量)

    在C中判断变量存储类型(字符常量/数组/动态变量) 在chinaunix论坛上有人问到关于变量存府类型的问题,我觉得可以写个测试代码加深大家对内存使用和布局的理解.下面我把原问题及处理办法贴出来,限供 ...

  6. 深入PHP变量存储结构 标签: PHP存储

    1.深入PHP变量存储结构 标签: PHP存储  分类: 编程语言(10)  首先声明,我并没有去读PHP的源码,只是对于PHP的有时候诡异的表现感兴趣,找了一下开发人员laruence的博客结合PH ...

  7. java 中变量存储位置的区别

    1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.  2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字 ...

  8. python变量存储

    变量的存储 在高级语言中,变量是对内存及其地址的抽象. 对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只 ...

  9. python 基础之变量存储缓存机制与数据驻留小数据池

    一:变量存储的缓存机制 在同一文件(模块)里,变量存储的缓存机制 (仅对python3.x版本负责),那么 --对于Number (int bool float complex) 1.对于整型而言,- ...

随机推荐

  1. apache-tomcat-7.0.70无法进入Manager管理App项目

    在tomcat文件夹找到conf文件夹中的tomcat-user.xml文件,用记事本打开,在最下面可以看到tomcat默认把用户注释掉了,也就是说打开tomcat主页是进不去管理页面的.方法如下:找 ...

  2. unit正交相机Size的计算公式

    如:相机的大小为800*480,要使相机适应800*480像素的图,则 Size = 相机高/2/像素单位 = 480/2/100 = 2.4

  3. android ScrollView嵌套EditText

    editext.setOnTouchListener(new OnTouchListener() {                        @Override            publi ...

  4. js 基础对象二

    大的分类 JavaScript 对象 JS Array JS Boolean JS Date JS Math JS Number JS String JS RegExp JS Functions JS ...

  5. Compress a folder using powershell

    There are many ways to compress a folder using powershell: Method 1: Using System.IO.Compression and ...

  6. PAT1008

    1008. Elevator (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B The highest building in our city has on ...

  7. Notice: ob_end_clean() [ref.outcontrol]: failed to delete buffer. No buffer to delete

    解决方法一 @ob_end_clean(); 解决方法二 if(ob_get_contents()) ob_end_clean();

  8. VLAN及Trunk实验

    VLAN及Trunk实验 一 基本VLAN试验 实验拓扑: 实验目的:掌握VLAN基本配置 掌握静态接口VLAN划分 实验需求:在交换机switch上面创建两个VLAN,vlan2和vlan3,vla ...

  9. windows下,emacs的配置文件在哪儿?

    配置文件_Emacs在你的家目录下"C:/Documents and Settings/username/Application Data". 在Window 7下,配置文件目录在 ...

  10. Ubuntu系统如何修改主机名

    1.执行命令 hostname temp_name 这样主机名就改掉了.只不过重启后名字会恢复不一定使我们想要的.机器重启后会重新去读取/etc/hostname里面存储的主机名.所以如果想永久改掉的 ...