亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP內核探索之變量

2024-05-04 23:41:16
字體:
來源:轉載
供稿:網友
php變量由變量名,類型,內容等部分組成,本文給大家分享php內核探索之變量,對php內核探索相關知識感興趣的朋友一起學習吧
 

php變量組成部分:

變量名:php語言的變量名以$開頭+英文/下劃線,可以包含數字、下劃線、字母,區分大小寫。同時PHP也支持復合變量,形如$$A,增加了php的動態性。

類型:php屬于弱類型語言,可以賦值任意類型的值。

內容:在同一時刻只能有一種值。

php語言中存在8中數據類型,分為三大類:

1. 標量類型:Boolean,integer,float,string; 

2. 復合類型:object,array; 

3. 特殊類型:NULL,resource;

php作為一種弱類型語言,在實現內部所有變量是通過結構zval來存儲數據的,不僅包含變量的值,也包含變量的類型,是php弱類型的核心。 

zval數據結構:

struct _zval_struct{  zvalue_value value;    //存儲變量的值  zend_unint  refcount_gc; //引用計數  zend_char  is_ref_gc;  // 是否為引用  zend_char  type;     //存儲變量的類型}

其中zvalue_value并不是一個結構體,為了節省內存使用的union來實現的,因為在同一時刻變量只能表示一種類型。其原型:

typedef union _zvalue_value{  long lval;           double dval;  struct {      char *val;      int len;      //字符串的長度    }str;  HashTable *ht;       //保存數組  zend_object_value obj;   //對象}zvalue_value;

哈希表:

php內部很多實現基于哈希表:變量的作用域、函數表、類的屬性、方法等,Zend引擎內部的很多數據都是保存在哈希表中的。 

php數組使用哈希表來存儲關聯數據,哈希表實現使用兩個數據結構HashTable和Bucket:

HashTable:

typedef struct _hashtable {   uint nTableSize;    // hash Bucket的大小,最小為8,以2x增長。  uint nTableMask;    // nTableSize-1 , 索引取值的優化  uint nNumOfElements;  // hash Bucket中當前存在的元素個數,count()函數會直接返回此值   ulong nNextFreeElement; // 下一個數字索引的位置  Bucket *pInternalPointer;  // 當前遍歷的指針(foreach比for快的原因之一)  Bucket *pListHead;     // 存儲數組頭元素指針  Bucket *pListTail;     // 存儲數組尾元素指針  Bucket **arBuckets;     // 存儲hash數組  dtor_func_t pDestructor;  // 在刪除元素時執行的回調函數,用于資源的釋放  zend_bool persistent;    // 指出了Bucket內存分配的方式。如果persisient為TRUE,                  則使用操作系統本身的內存分配函數為Bucket分配內存,否則使用                  PHP的內存分配函數。  unsigned char nApplyCount; // 標記當前hash Bucket被遞歸訪問的次數(防止多次遞歸)  zend_bool bApplyProtection;// 標記當前hash桶允許不允許多次訪問,不允許時,最多只能遞歸3次#if ZEND_DEBUG  int inconsistent;#endif} HashTable;

在HashTable中容量的擴增,始終調整為接近初始大小的2的整數次方。因為: 

在選槽時,這里使用&操作而不是使用取模,這是因為是相對來說取模操作的消耗和按位與的操作大很多。mask的作用就是將哈希值映射到槽位所能存儲的索引范圍內。 例如:某個key的索引值是21, 哈希表的大小為8,則mask為7,則求與時的二進制表示為: 10101 & 111 = 101 也就是十進制的5。 因為2的整數次方-1的二進制比較特殊:后面N位的值都是1,這樣比較容易能將值進行映射, 如果是普通數字進行了二進制與之后會影響哈希值的結果。那么哈希函數計算的值的平均分布就可能出現影響。

bucket:

typedef struct bucket {  ulong h;      // 對char *key進行hash后的值,或者是用戶指定的數字索引值  uint nKeyLength;  // hash關鍵字的長度,如果數組索引為數字,此值為0  void *pData;    // 指向value,一般是用戶數據的副本,如果是指針數據,則指向pDataPtr  void *pDataPtr;   //如果是指針數據,此值會指向真正的value,同時上面pData會指向此值  struct bucket *pListNext;  // 整個hash表的下一元素  struct bucket *pListLast;  // 整個哈希表該元素的上一個元素  struct bucket *pNext;    // 存放在同一個hash Bucket內的下一個元素  struct bucket *pLast;    // 同一個哈希bucket的上一個元素// 保存當前值所對于的key字符串,這個字段只能定義在最后,實現變長結構體  char arKey[1];       } Bucket; 

在Bucket中存儲的是哈希值而不是哈希的索引。

上面結構體的最后一個字段用來保存key的字符串,而這個字段卻申明為只有一個字符的數組, 其實這里是一種長見的變長結構體,主要的目的是增加靈活性。 以下為哈希表插入新元素時申請空間的代碼

p = (Bucket *) pemalloc(sizeof(Bucket) - 1 + nKeyLength, ht->persistent);if (!p) {  return FAILURE;}memcpy(p->arKey, arKey, nKeyLength);

插入過程圖

哈希算法 

php中hash函數使用DJBX33A算法來實現。

對象: 

php對象使用數據結構zend_object_value來存儲;



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性亚洲最疯狂xxxx高清| 91中文在线观看| 国产精品第3页| 亚洲人精品午夜在线观看| 丝袜美腿精品国产二区| 欧美激情视频一区二区三区不卡| 日韩精品在线视频观看| 欧洲精品在线视频| 搡老女人一区二区三区视频tv| 亚洲国产欧美日韩精品| 亚洲国产高清自拍| 欧美日韩国产区| 国产精品成熟老女人| 亚洲国产美女久久久久| 国产福利视频一区二区| 亚洲久久久久久久久久| 欧美亚洲另类在线| 日韩成人免费视频| 揄拍成人国产精品视频| 亚洲精品丝袜日韩| 亚洲日本成人女熟在线观看| 亚洲自拍欧美另类| 成人激情视频小说免费下载| 欧美久久久精品| 亚洲性夜色噜噜噜7777| 国产一区二区免费| 亚洲欧美日本伦理| 国产成人综合久久| 久久精品人人做人人爽| 日韩美女视频在线观看| 久久久女女女女999久久| 亚洲午夜精品久久久久久性色| 亚洲欧洲高清在线| 欧美一级免费视频| 最新的欧美黄色| 亚洲第一福利网| 亚洲97在线观看| 日韩一区av在线| 欧美精品久久久久久久久| 久久久免费精品视频| 亚洲国产精品成人精品| 日韩欧美在线免费观看| 97人人爽人人喊人人模波多| 亚洲一二在线观看| 国产精品久久视频| 欧美高清视频在线播放| 欧美精品中文字幕一区| 亚洲欧美日韩第一区| 91国产高清在线| 91社影院在线观看| 91久久精品国产91性色| 亚洲男人av在线| www日韩中文字幕在线看| 国产成人啪精品视频免费网| 国产日韩欧美另类| 欧美裸体xxxx| 久久久久久免费精品| 麻豆国产精品va在线观看不卡| 日本高清久久天堂| 国产精品www色诱视频| 91国语精品自产拍在线观看性色| 亚洲曰本av电影| 91亚洲精品在线| 日韩精品在线观看视频| 最近中文字幕日韩精品| xvideos成人免费中文版| 久久精品夜夜夜夜夜久久| 日韩久久精品电影| 日本国产精品视频| 91国产精品电影| 亚洲欧洲偷拍精品| 91精品综合久久久久久五月天| 81精品国产乱码久久久久久| 国产69久久精品成人| 8090理伦午夜在线电影| 国产日韩精品电影| 日韩成人av在线播放| 成人在线中文字幕| 欧美日韩在线观看视频小说| 亚洲国产精品久久91精品| 欧洲s码亚洲m码精品一区| 国产精品偷伦免费视频观看的| 大荫蒂欧美视频另类xxxx| 欧美成年人在线观看| 日韩av第一页| 亚洲最新av在线| 国产精品美女免费看| 久久久亚洲欧洲日产国码aⅴ| 亚洲第一中文字幕在线观看| 中文字幕亚洲欧美日韩在线不卡| 欧美限制级电影在线观看| 深夜福利一区二区| 国产丝袜一区二区三区免费视频| 亚洲国产精品va在线观看黑人| 久久久精品在线观看| 精品女同一区二区三区在线播放| 日韩中文字幕欧美| 欧美日韩精品在线观看| 成人做爽爽免费视频| 亚洲成人教育av| 97视频免费在线观看| 一本久久综合亚洲鲁鲁| 亚洲精品97久久| 日韩电影在线观看永久视频免费网站| 亚洲网站在线播放| 色悠悠国产精品| 成人做爰www免费看视频网站| 亚洲va欧美va在线观看| 亚洲色图av在线| 欧美激情一区二区三区久久久| 一区二区三欧美| 国产成人av网| 亚洲成人免费在线视频| 久久综合国产精品台湾中文娱乐网| 亚洲美女性生活视频| 欧美肥老妇视频| 岛国av一区二区在线在线观看| 青青久久av北条麻妃黑人| 俺去亚洲欧洲欧美日韩| 精品在线欧美视频| 久久男人av资源网站| 欧美专区第一页| 日本欧美精品在线| 久久精品成人一区二区三区| 国内免费精品永久在线视频| 国产精品扒开腿做爽爽爽视频| 欧美理论电影在线观看| 国产成人久久久精品一区| 91免费人成网站在线观看18| 亚洲国产小视频在线观看| 精品激情国产视频| 国产精品综合久久久| 日韩一区二区在线视频| 国产一区私人高清影院| 国产精品美女无圣光视频| 黄色一区二区在线| 秋霞午夜一区二区| 成人黄色av网站| 国产精品一区二区3区| 91久久精品美女| 97香蕉超级碰碰久久免费的优势| 九九精品在线播放| 川上优av一区二区线观看| 成人免费网站在线观看| 欧美精品18videos性欧| 欧美日韩性视频在线| 91免费的视频在线播放| 欧美日韩综合视频| 超碰精品一区二区三区乱码| 亚洲a成v人在线观看| 日本不卡高字幕在线2019| 高跟丝袜一区二区三区| 欧美性xxxxxx| 国产手机视频精品| 欧美人在线观看| 岛国av一区二区三区| 国产精品美女久久| 日韩中文字幕免费看| 成人午夜激情免费视频| 亚洲精品动漫久久久久| 亚洲色图17p| 亚洲精品黄网在线观看| 亚洲精品美女久久久久| 国产精品久久久久久久电影|