PHP的变量和变量类型的底层实现

PHP代码的执行过程:

        编译型语言:

                使用专门的编译器(类似于Windows下的Visual Studio)、针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序(.exe)的格式,这个转换过程称为编译(Compile)。编译生成的可执行程序可以以脱离开发环境,在特定的平台上独立运行。

                编译型语言的代码是一次编译,循环使用。换句话说就是前人种树,后人乘凉。

                C、C++ 等都属于编译型语言

        解释型语言:

                在程序运行前将源程序预编译成中间语言,然后再由解释器执行中间语言。每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且它不能脱离解释器独立运行。

                PHP、Python、Java等都是解释型语言。

                PHP稍有特殊之处,虽然是一个脚本语言,但不是靠解释器解释。而是zend虚拟机,屏蔽了操作系统的区别。php代码编译成opcode, 由zend虚拟机来执行opcode。但是---opcode, PHP脚本一结束,opcode就清除了.


PHP底层用C语言来实现的,C语言是强类型,而PHP是弱类型语言.是如何实现的呢?

PHP的变量和变量类型的底层实现_第1张图片
PHP的源码包的目录结构

        Zend目录:这是zend虚拟的实现. 包括栈,数据类型,编译器等,都在这实现.

        main目录:PHP的一些内建函数,最主要函数都在这里放着.

        ext目录:  PHP的扩展.PHP的大部分功能,都是以extenstion形式来完成的.


变量在内存中的存储结构

        PHP变量是通过zval结构体来存储的

PHP的变量和变量类型的底层实现_第2张图片

        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

        补充:PHP中有8种数据类型,为什么zval->value 联合体中,只有5种?

        1: NULL,直接 zval->type = IS_NULL,就可以表示,不必设置  value的值.

        2: BOOL型 , zval->type = IS_BOOL, 再设置 zval.value.lval = 1/0;

        3: Resourc型 ,资源型 往往是服务器上打开的一个接口,如果 文件读取接口.

            zval->type = IS_RESOURCE, zval->tyoe.lval =服务器上打开的接口的编号

值的存储

        PHP变量的值是放在zval结构体中的value段中的

PHP的变量和变量类型的底层实现_第3张图片

        通过上图可以看出,在PHP中,字符串类型,长度是已经缓存的,调用strlen时,系统可以直接返回其长度,不必计算.时间复杂度为O(1)

你可能感兴趣的:(PHP的变量和变量类型的底层实现)