PHP底层原理分析(一):PHP变量的底层实现

袁志蒙 次浏览

摘要:PHP是一种适用于web开发的动态语言。具体点说,就是一个用C语言实现包含大量组件模块的软件框架。是一个强大的UI框架。简言之;PHP动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,...

PHP是一种适用于web开发的动态语言。具体点说,就是一个用C语言实现包含大量组件模块的软件框架。是一个强大的UI框架。

简言之;PHP动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。PHP本身是用C实现的,因此最终调用的也是C的函数,实际上,我们可以把PHP看做一个C开发的软件。

一、PHP代码的执行过程:

编译型语言:

对于C语言,C++, 编译成机器码(二进制)来运行.

java语言, 把.java编译成 .class,称为bytecode, 由jvm来运行.

解释语言:

解释器解释执行. 典型的如 linux shell.

解释器逐行来执行命令.


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

但是---opcode, PHP脚本一结束,opcode就清除了.

思考:opcode能否缓存? 

PHP本身不支持,但是apc,xcache等加速器,实现了这样的效果.

二、PHP变量的底层实现:

下载PHP的源码包,看到如下的目录:

PHP底层原理分析(一)

其中,最核心的---Zend目录, 这是zend虚拟的实现. 包括栈,数据类型,编译器等,都在这实现.

最主要的main --PHP的一些内建函数,最主要函数都在这里放着.最大的一个目录 ext -- PHP的扩展.

PHP的大部分功能,都是以extenstion形式来完成的,如果你开发了一个扩展,也放在ext目录下.


在zend中,PHP变量是怎么实现的?

找到文件Zend/zend.h的第316行,PHP中的一个变量就是zval中的一个结构体来描述的,如图:

PHP底层原理分析(一)

结构体的字段解释:

struct _zval_struct {
	/* Variable information */
	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)是如何存放的,在第305行找到:

PHP底层原理分析(一)

我们发现在PHP中,字符串类型,长度是已经缓存的,调用strlen时,系统可以直接返回其长度,不必计算.

疑问:

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 = 服务器上打开的接口的编号

//如我们声明一个变量,那么一个结构体就产生了:
$a = 3;
{
value : [long lval = 3]
type: IS_LONG
}

$a = 3.5
{
value: [double dval = 3.5]
type:IS_DOUBLE
}


随机新闻

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~