深入理解PHP內核:變量及數據類型

1、現實生活中我們會找一個小箱子來存放物品,一來顯得不那麼凌亂,二來方便以後找到。計算機也是這個道理,我們需要先在內存中找一塊區域,規定用它來存放數據,並起一個好記的名字,方便以後查找。這塊區域就是“小箱子”,我們可以把數據放進去了。

2、數據類型用來說明數據的類型,確定了數據的解釋方式,同時指明瞭數據的長度,也就是數據佔用的字節數

3、變量名就是給那塊內存區域起了個名字,方便使用

4、.從類型劃分

1)靜態類型語言:比如c/java,類型檢查在編譯器確定

2)動態類型語言: 比如PHP/python,類型在運行時確定

3)無類型語言: 比如彙編語言,對類型無知

5、PHP變量類型及存儲結構

PHP在聲明或使用變量的時候,並不需要顯式指明其數據類型。

PHP是弱類型語言,這並不表示PHP沒有類型,在PHP中,存在8種變量類型

標量類型: boolean、integer、float(double)、string

複合類型: array、object

特殊類型: resource、NULL

6、PHP變量存儲結構

變量的值存儲到以下所示zval結構體中

typedef struct _zval_struct zval;

struct _zval_struct {

    /* Variable information */

    zvalue_value value;     /* value */

    zend_uint refcount__gc;

    zend_uchar type;    /* active type */

    zend_uchar is_ref__gc;

};

1)結構體是一種集合,它裏面包含了多個變量或數組,它們的類型可以相同,也可以不同,每個這樣的變量或數組都稱爲結構體的成員(Member),使用結構體(Struct)來存放一組不同類型的數據

7、PHP變量類型

zval結構體的type字段就是實現弱類型最關鍵的字段了,type的值可以爲: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。 從字面上就很好理解,他們只是類型的唯一標示,根據類型的不同將不同的值存儲到value字段。 除此之外,和他們定義在一起的類型還有IS_CONSTANT和IS_CONSTANT_ARRAY。

這和我們設計數據庫時的做法類似,爲了避免重複設計類似的表,使用一個標示字段來記錄不同類型的數據。

8、PHP變量的值存儲

變量的值存儲在zvalue_value聯合體中

typedef union _zvalue_value {

    long lval;                  /* long value */

    double dval;                /* double value */

    struct {

        char *val;

        int len;

    } str;

    HashTable *ht;              /* hash table value */

    zend_object_value obj;

} zvalue_value;

結構體和聯合體的區別在於:結構體的各個成員會佔用不同的內存,互相之間沒有影響;而聯合體的所有成員佔用同一段內存,修改一個成員會影響其餘所有成員。

結構體佔用的內存大於等於所有成員佔用的內存的總和(成員之間可能會存在縫隙),聯合體佔用的內存等於最長的成員佔用的內存。聯合體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。

1)一般類型

宏定義是預處理命令的一種,它允許用一個標識符來表示一個字符串#define 宏名 字符串

帶參數宏定義對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。

2)字符串String

struct {

    char *val;

    int len;

} str;

C中字符串是以\0結尾的字符數組,這裏多存儲了字符串的長度,這和我們在設計數據庫時增加的冗餘字段異曲同工。 因爲要實時獲取到字符串的長度的時間複雜度是O(n),而字符串的操作在PHP中是非常頻繁的,這樣能避免重複計算字符串的長度, 這能節省大量的時間,是空間換時間的做法。

這麼看在PHP中strlen()函數可以在常數時間內獲取到字符串的長度。 計算機語言中字符串的操作都非常之多,所以大部分高級語言中都會存儲字符串的長度。

1.其實在C語言中沒有專門的字符串類型,我們只能使用數組或者指針來間接地存儲字符串。

2.字符數組實際上是一系列字符的集合,也就是字符串(String),在C語言中,字符串總是以'\0'作爲串的結束符。數組的長度要比字符串的長度(字符串長度不包括 '\0')大1

3.另外一種表示字符串的方法,就是直接使用一個指針指向字符串,字符串中的所有字符在內存中是連續排列的,val指向的是字符串的第 0 個字符;我們通常將第 0 個字符的地址稱爲字符串的首地址。字符串中每個字符的類型都是char,所以 str 的類型也必須是char *

PHP的弱變量容器的實現方式是兼容幷包的形式體現,針對每種類型的變量都有其對應的標記和存儲空間。 使用強類型的語言在效率上通常會比弱類型高,因爲很多信息能在運行之前就能確定,這也能幫助排除程序錯誤。 而這帶來的問題是編寫代碼相對會受制約。

以上內容希望幫助到大家,更多PHP大廠PDF面試文檔,PHP進階架構視頻資料,PHP精彩好文免費獲取可以關注公衆號:PHP開源社區,或者訪問:

2021金三銀四大廠面試真題集錦,必看!

騰訊一面的Redis秒殺面試題你會麼?

四年精華PHP技術文章整理合集——PHP框架篇

四年精華PHP技術文合集——微服務架構篇

四年精華PHP技術文合集——分佈式架構篇

四年精華PHP技術文合集——高併發場景篇

四年精華PHP技術文章整理合集——數據庫篇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章