草稿1

问题1:

php的底层是c写的。c是强类型语言,而php是弱类型语言。php是如何实现的呢?

答:

php的一个变量,在c中是一个结构体,这个结构体叫做zval。(记住这个结构体的名字。)

这个结构体由四个部分组成。

zvalue_uchar type:变量的类型。

在zend引擎解析php源码的时候,当发生赋值操作时,会给这个值一个zval结构体。其中type为其类型,zend引擎会根据一定规则判断值的类型,放入以下常量之一:

IS_NULL, IS_BOOL,IS_LONG,IS_DOUBLE

IS_STRING,IS_ARRAY,IS_OBJECT

IS_RESOURCE

然后根绝type的类型,在zval结构体中,找到zvalue_value 联合体中的对应类型,找到对应的c变量存储之。

问题2:

zval中的类型type有8个,而 value联合体中的值只有5种,why?

答案:

IS_LONG,IS_DOUBLE

IS_STRING,IS_ARRAY,IS_OBJECT

分别对应value种的五种类型。

对于

IS_NULL, IS_BOOL,IS_RESOURCE

null类型不用存储值,type为IS_NULL即可判定。

bool类型,type为long,值1为true,值0为false,

资源类型,type为long,值value里的dval为资源标号。

总结:

php里的变量是通过c语言种的结构体存储。

类型会通过zend引擎根据一定规则监测,自动判断,并设置其type和value。

问题3:有人说,php种的全局变量存储在全局区,局部变量存储在局部区,这个说法正确吗?

错:大错特错。

对于php种的变量来说,其无论是全局变量还是局部变量,创建都包括三个步骤。

1  创建zval结构体,设置type。

2 根据type设置value联合体种的值。

符号表里加入变量名,指向这个zval。

问题4:

符号表是什么?

有一个全局符号表,一个局部符号表。

zvalue_value  

问题2:

原文地址:https://www.cnblogs.com/phper007/p/3100378.html