草稿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联合体种的值。
3 符号表里加入变量名,指向这个zval。
问题4:
符号表是什么?
有一个全局符号表,一个局部符号表。
zvalue_value
问题2: