繁體
|
簡體
Sclub交友聊天~加入聊天室當版主
(檢舉)
分享
新浪微博
QQ空间
人人网
腾讯微博
Facebook
Google+
Plurk
Twitter
Line
标题:
【5】插播:深入理解PHP原理之变量结构
[打印本页]
作者:
flashroad
时间:
2018-7-28 10:44
标题:
【5】插播:深入理解PHP原理之变量结构
【版权】
https://blog.csdn.net/lml200701158/article/details/52232337
作者:
flashroad
时间:
2018-7-28 10:48
我们已经知道PHP是一种弱语言,也就是在PHP编程中,我们并不关注PHP中变量的类型,这点和
C语言
这种强类型语言有非常大的区别。
但是PHP是由C来实现的,这是不是有点戏剧化呢,哈哈~~若仔细研究PHP内部的实现细节,其实还挺有意思的,下面初步看一下PHP中对不同类型变量的申明:
<?php
$var = 1; //int
$var = "PHP"; //string
$var = 1.01; //float
$var = array(); //array
$var = new Exception('error'); //object;
?>
复制
对于这些不同的数据类型,PHP是怎样进行识别的呢?
下面让我们看看PHP中变量在内核中的存储结构,该结构主要由
结构体zval
和
联合体zvalue_value
组成,至于结构体和联合体的区别,网上教程很多,在此就不多说,下面让我们看看这两个结构是怎么使用的【在楼下:)
】。
作者:
flashroad
时间:
2018-7-28 10:52
struct _zval_struct {
zvalue_value value; // 存储变量的值
zend_uint refcount__gc; // 引用计数
zend_uchar type; // 变量的类型
zend_uchar is_ref__gc; // 是否引用
} zval;
typedef union _zvalue_value {
long lval; // boolean integer
double dval; // float double
struct {
char *val;
int len;
} str; // string
HashTable *ht; // array
zend_object_value obj; // object
} zvalue_value;
复制
先让我们看看结构体zval,里面有4个参数,对于单个变量而言,仅仅zval.value和zval.type就可以完全表示,另外两个变量zval.refcount__gc和zval.is_ref__gc,他们是对变量赋值和变量引用时会用到,这个就涉及到变量的引用与分离,该部分内容后续会单独讲。对于变量的类型zval.type,目前包括null、bool、long、double、string、array、object和resorce,变量的内容为zval.value,我们下面具体分析该内容内部的结构。
zvalue_value.lval会记录bool和integer的数值,zvalue_value.dval会记录float或double类型的数值,然后zvalue_value.str会记录一个字符串,结构如下:
struct {
char *val;
int len;
} str;
复制
字符串zvalue_value.str也是个结构体,里面记录该字符串的长度zvalue_value.str.len和首指针zvalue_value.str.val,zvalue_value.ht和zvalue_value.obj本别表示数组和对象,这两个比较复杂,后续会进行深度解析。
作者:
flashroad
时间:
2018-9-22 18:53
他[她]看完这篇文章说:
(来自快速回帖模式)
欢迎光临 flash之路-flash技术交流 (http://flashroad.joinbbs.net/)
Powered by Discuz! 7.2