免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享

【5】插播:深入理解PHP原理之变量结构

本文来自:★flash之路-flash技术交流★ 转帖请注明出处! 作者:flashroad 您是第2469个浏览者

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
flashroad友情提示:
“点评”不是“回帖”!
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.

友情提示:单击下列任意一个表情,即可瞬间自动回复本帖!

好贴......
郁闷......
开心......
擦汗......
鄙视......
狂怒
谢谢
爱你呦
拜托了
嗯嗯
OMG
求关注
伤心......
无奈.....
无奈.....
无奈.....
无奈.....
无奈.....
哈哈哈
NO
OK
what
我来了

最近访问本帖者列表:

flashroad
访问时间:2018-09-28 14:53

打赏

取消

感谢您的支持,我会继续努力的!

扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by 爱秀代码,分享从这里开始,精彩与您同在

点评
B Color Smilies

您还可以输入:个字符
X

X

我们已经知道PHP是一种弱语言,也就是在PHP编程中,我们并不关注PHP中变量的类型,这点和C语言这种强类型语言有非常大的区别。
但是PHP是由C来实现的,这是不是有点戏剧化呢,哈哈~~若仔细研究PHP内部的实现细节,其实还挺有意思的,下面初步看一下PHP中对不同类型变量的申明:

  1. <?php
  2.   $var = 1;                      //int
  3.   $var = "PHP";                  //string
  4.   $var = 1.01;                   //float
  5.   $var = array();                //array
  6.   $var = new Exception('error'); //object;
  7. ?>
复制


对于这些不同的数据类型,PHP是怎样进行识别的呢?
下面让我们看看PHP中变量在内核中的存储结构,该结构主要由结构体zval联合体zvalue_value组成,至于结构体和联合体的区别,网上教程很多,在此就不多说,下面让我们看看这两个结构是怎么使用的【在楼下:)】。
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

  1. struct _zval_struct {
  2.     zvalue_value value;       // 存储变量的值
  3.     zend_uint refcount__gc;   // 引用计数
  4.     zend_uchar type;          // 变量的类型
  5.     zend_uchar is_ref__gc;    // 是否引用
  6. } zval;

  7. typedef union _zvalue_value {
  8.     long lval;              // boolean integer
  9.     double dval;            // float double
  10.     struct {               
  11.         char *val;
  12.         int len;
  13.     } str;                  // string
  14.     HashTable *ht;          // array
  15.     zend_object_value obj;  // object
  16. } 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会记录一个字符串,结构如下:
  1. struct {
  2.     char *val;
  3.     int len;
  4. } str;
复制
字符串zvalue_value.str也是个结构体,里面记录该字符串的长度zvalue_value.str.len和首指针zvalue_value.str.val,zvalue_value.ht和zvalue_value.obj本别表示数组和对象,这两个比较复杂,后续会进行深度解析。
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

他[她]看完这篇文章说:

(来自快速回帖模式)
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

 

B Color Image Link Quote Code Smilies
高级模式 | 发新话题

您需要登录后才可以回帖 登录|立即注册

快速
返回顶部
返回首页