91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP的變量是什么意思

發布時間:2021-07-02 15:38:32 來源:億速云 閱讀:346 作者:chen 欄目:開發技術

本篇內容主要講解“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的變量是什么意思”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

萍乡市| 洛宁县| 麻栗坡县| 栾城县| 吉水县| 本溪市| 建德市| 怀仁县| 绥江县| 彭泽县| 尼玛县| 尚志市| 丰宁| 铜陵市| 大埔区| 浦北县| 南开区| 武汉市| 平和县| 巫山县| 刚察县| 宁陕县| 称多县| 天镇县| 武乡县| 贵南县| 察雅县| 桂阳县| 靖安县| 建昌县| 兴和县| 凌源市| 永寿县| 壤塘县| 祁阳县| 天台县| 旬阳县| 华安县| 新闻| 桑植县| 原平市|