一、現實生活中咱們會找一個小箱子來存放物品,一來顯得不那麼凌亂,二來方便之後找到。計算機也是這個道理,咱們須要先在內存中找一塊區域,規定用它來存放數據,並起一個好記的名字,方便之後查找。這塊區域就是「小箱子」,咱們能夠把數據放進去了。java
二、數據類型用來講明數據的類型,肯定了數據的解釋方式,同時指明瞭數據的長度,也就是數據佔用的字節數python
三、變量名就是給那塊內存區域起了個名字,方便使用laravel
四、.從類型劃分面試
1)靜態類型語言:好比c/java,類型檢查在編譯器肯定sql
2)動態類型語言: 好比PHP/python,類型在運行時肯定shell
3)無類型語言: 好比彙編語言,對類型無知數據庫
五、PHP變量類型及存儲結構數組
PHP在聲明或使用變量的時候,並不須要顯式指明其數據類型。服務器
PHP是弱類型語言,這並不表示PHP沒有類型,在PHP中,存在8種變量類型架構
標量類型: boolean、integer、float(double)、string
複合類型: array、object
特殊類型: resource、NULL
六、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)來存放一組不一樣類型的數據
七、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。
這和咱們設計數據庫時的作法相似,爲了不重複設計相似的表,使用一個標示字段來記錄不一樣類型的數據。
八、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的弱變量容器的實現方式是兼容幷包的形式體現,針對每種類型的變量都有其對應的標記和存儲空間。 使用強類型的語言在效率上一般會比弱類型高,由於不少信息能在運行以前就能肯定,這也能幫助排除程序錯誤。 而這帶來的問題是編寫代碼相對會受制約。
以上內容但願幫助到你們,不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要
點擊PHP進階架構師>>>視頻、面試文檔免費獲取