php底层学习-代码执行和变量的存储

本文是学习燕十八老师的视频总结

php代码执行流程

这里写图片描述

php有zend引擎编译为opcode,然后由zend虚拟机来执行opcode,但是一执行结束,opcode就会被清除
可以安装第三方加速器(apc,xcache)来缓存opcode,zend自身不支持

流程展示

zend编译器(执行opcode)

zend虚拟机(编译opcode)

操作系统


php是c开发的,c是强类型语言,而php是弱类型语言,是怎么实现的呢?

php的一个变量,在c中是由下面的结构体来描述的
………………………………………
typedef struct _zval_struct zval;

struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc; /引用次数/
zend_uchar type; /* active type 活动(值)的类型 */
zend_uchar is_ref__gc; /* 是否引用标识*/
};

zend_uchar type 根据语句情景,当时的数据类型
例如: echo 2 + ‘3’ 此时’3’活动类型为int型

zvalue 的取值(_zvalue_value 联合体) 提供了五种结构类型

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;

type的取值(8种)

IS_NULL , IS_BOOL.IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_RESOURCE,IS_OBJECT

例如
a=3;/unionzvaluelong3//typeISLONG//typerefgccount:1isrefgc:0/: a = 3 ; / ∗ 产 生 一 个 结 构 体 u n i o n z v a l u e l o n g 3 / / 通 过 联 合 体 存 储 一 个 值 t y p e I S L O N G / / 通 过 t y p e 描 述 变 量 类 型 r e f g c c o u n t : 1 i s r e f g c : 0 ∗ / 例 如 : a = ‘hello,world’;
产生了一个结构体

{
{
char:’hello,world’
length:11,
}
type:IS_STRING,
refcount_gc:1
is_ref_gc:0
}
在这个结构体中可以看到,strlen的速度很快,因为在联合体中直接维护这字符串的长度,所以进行strlen时能够直接读出字符串的长度,时间复杂度为O(1)

问题:在结构体中提供了8中数据类型,为什么在联合体中值提供了五种

type为 IS_NULL 时,值中没有必要再存储
type为IS_BOOL时,值中用1或0标识
type为IS_RESOURCE时,值为服务端打开资源的编号,其实值也是用整型来标识

变量名的处理

HashTable Symbol_table 全局符号表
symbol_table存放了变量名和结构体所在的地址

例如:
a=1; a = 1 ; b = 1.1;
$c = ‘1’
不仅产生了三个结构体,还在全局的symbol_table中存储了这三个变量名和相应的内存中的地址
a —-> 0x123(结构体1的地址)
b—–> 0x112(结构体1.1的地址)
c—–> 0x132(结构体’1’的地址)

未完继续…

另外推荐一篇博客https://www.cnblogs.com/tangchuanyang/p/6185655.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值