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開源社區,或者訪問: