麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開(kāi)發(fā) > PHP > 正文

PHP內(nèi)核探索之變量

2024-05-04 23:41:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
php變量由變量名,類型,內(nèi)容等部分組成,本文給大家分享php內(nèi)核探索之變量,對(duì)php內(nèi)核探索相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
 

php變量組成部分:

變量名:php語(yǔ)言的變量名以$開(kāi)頭+英文/下劃線,可以包含數(shù)字、下劃線、字母,區(qū)分大小寫(xiě)。同時(shí)PHP也支持復(fù)合變量,形如$$A,增加了php的動(dòng)態(tài)性。

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

內(nèi)容:在同一時(shí)刻只能有一種值。

php語(yǔ)言中存在8中數(shù)據(jù)類型,分為三大類:

1. 標(biāo)量類型:Boolean,integer,float,string; 

2. 復(fù)合類型:object,array; 

3. 特殊類型:NULL,resource;

php作為一種弱類型語(yǔ)言,在實(shí)現(xiàn)內(nèi)部所有變量是通過(guò)結(jié)構(gòu)zval來(lái)存儲(chǔ)數(shù)據(jù)的,不僅包含變量的值,也包含變量的類型,是php弱類型的核心。 

zval數(shù)據(jù)結(jié)構(gòu):

struct _zval_struct{  zvalue_value value;    //存儲(chǔ)變量的值  zend_unint  refcount_gc; //引用計(jì)數(shù)  zend_char  is_ref_gc;  // 是否為引用  zend_char  type;     //存儲(chǔ)變量的類型}

其中zvalue_value并不是一個(gè)結(jié)構(gòu)體,為了節(jié)省內(nèi)存使用的union來(lái)實(shí)現(xiàn)的,因?yàn)樵谕粫r(shí)刻變量只能表示一種類型。其原型:

typedef union _zvalue_value{  long lval;           double dval;  struct {      char *val;      int len;      //字符串的長(zhǎng)度    }str;  HashTable *ht;       //保存數(shù)組  zend_object_value obj;   //對(duì)象}zvalue_value;

哈希表:

php內(nèi)部很多實(shí)現(xiàn)基于哈希表:變量的作用域、函數(shù)表、類的屬性、方法等,Zend引擎內(nèi)部的很多數(shù)據(jù)都是保存在哈希表中的。 

php數(shù)組使用哈希表來(lái)存儲(chǔ)關(guān)聯(lián)數(shù)據(jù),哈希表實(shí)現(xiàn)使用兩個(gè)數(shù)據(jù)結(jié)構(gòu)HashTable和Bucket:

HashTable:

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

在HashTable中容量的擴(kuò)增,始終調(diào)整為接近初始大小的2的整數(shù)次方。因?yàn)椋?nbsp;

在選槽時(shí),這里使用&操作而不是使用取模,這是因?yàn)槭窍鄬?duì)來(lái)說(shuō)取模操作的消耗和按位與的操作大很多。mask的作用就是將哈希值映射到槽位所能存儲(chǔ)的索引范圍內(nèi)。 例如:某個(gè)key的索引值是21, 哈希表的大小為8,則mask為7,則求與時(shí)的二進(jìn)制表示為: 10101 & 111 = 101 也就是十進(jìn)制的5。 因?yàn)?的整數(shù)次方-1的二進(jìn)制比較特殊:后面N位的值都是1,這樣比較容易能將值進(jìn)行映射, 如果是普通數(shù)字進(jìn)行了二進(jìn)制與之后會(huì)影響哈希值的結(jié)果。那么哈希函數(shù)計(jì)算的值的平均分布就可能出現(xiàn)影響。

bucket:

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

在Bucket中存儲(chǔ)的是哈希值而不是哈希的索引。

上面結(jié)構(gòu)體的最后一個(gè)字段用來(lái)保存key的字符串,而這個(gè)字段卻申明為只有一個(gè)字符的數(shù)組, 其實(shí)這里是一種長(zhǎng)見(jiàn)的變長(zhǎng)結(jié)構(gòu)體,主要的目的是增加靈活性。 以下為哈希表插入新元素時(shí)申請(qǐng)空間的代碼

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

插入過(guò)程圖

哈希算法 

php中hash函數(shù)使用DJBX33A算法來(lái)實(shí)現(xiàn)。

對(duì)象: 

php對(duì)象使用數(shù)據(jù)結(jié)構(gòu)zend_object_value來(lái)存儲(chǔ);



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产成人精品网站 | 免费在线观看成年人视频 | 精品国产成人 | 黄色毛片前黄 | 国产精品成人亚洲一区二区 | 国产羞羞视频在线观看 | 国产69精品久久久久久久久久 | 亚洲精品永久视频 | 国产一级毛片高清 | 国产午夜精品理论片a级探花 | 韩国精品久久久 | 毛片视频在线免费观看 | 欧美精品成人一区二区三区四区 | 亚洲小视频网站 | 看91| 亚洲综合无码一区二区 | 一区小视频 | 视频一区二区不卡 | 日韩视频www | 久久久久久久一区 | 久久久久久久久久亚洲 | 狠狠干五月天 | 精品一区二区电影 | 天堂成人国产精品一区 | 青久草视频 | 99视频在线观看视频 | 91av亚洲| 91精品国产免费久久 | 久久亚洲春色中文字幕久久 | 国产成人精品区 | 亚洲天堂一级片 | 超碰人人做人人爱 | 极品大长腿啪啪高潮露脸 | 国产美女做爰免费视 | 一级做a爱片毛片免费 | 精品无吗乱吗av国产爱色 | 国产免费视频在线 | 看毛片电影 | 神马视频我不卡 | 欧美国产日韩在线观看成人 | 在线成人免费视频 |