C語言的結構和聯合,以及PHP是怎麽實現弱類型的
阿新 • • 發佈:2017-07-07
main 中一 字符 變量類型 type 以及 logs void 例子
C語言的結構(struct):包含多個成員,可能有多種數據類型,並且需要分配幾種類型占用空間之和的空間。
聯合(union):支持多種類型,供使用者使用其中一種數據類型,當然是需要分配其中占用空間最大的數據類型的大小。
結構和聯合通常是出現在一塊的。
PHP是用C語言來實現的,那麽思考下為什麽PHP可以實現弱類型呢?
答案就在C語言的結構和聯合上。
從弱類型變量的寫入和讀取二者分析:
有了聯合,我們可以定義幾種類型,讓php的變量在其中選取,這個可以解決變量寫入。那怎麽解決讀取這個變量呢?變量設置後,不知道這個變量使用的聯合中哪個類型,也就沒法讀取。
可以在結構中,設置一個成員專門記錄聯合中用的哪個類型。這樣就ok了。
用一個簡單的C例子演示一下:這裏只使用了三種類型,整數 浮點數和字符串,php的數組是用hashtable這裏就不說了。
#include <stdio.h> typedef union uval{ long a; double b; char * c; } uval; typedef struct pval{ uval val; int phptype; } pval; //enum void var_dump(pval); int main(){ pval pval1 = {{.a = 111}, 1}; var_dump(pval1);// int 111 pval1.phptype = 2; pval1.val.b = 1.21; var_dump(pval1);// float 1.210000 pval1.phptype = 3; pval1.val.c = "abc"; var_dump(pval1);// string abc } /** * @param val * 根據pval變量類型,決定讀取聯合體的那個類型 */ void var_dump(pval val){ if(val.phptype == 1){ printf("%s ", "int"); printf("%ld\n", val.val.a); } else if(val.phptype == 2){ printf("%s ", "float"); printf("%f\n", val.val.b); } else if(val.phptype == 3){ printf("%s ", "string"); printf("%s\n", val.val.c); } }
可以認為pval這種類型就是php的一個變量的類型。每一個php變量記錄了這個值val和類型phptype(實際還有引用計數等)。
每次寫入val時,要把其類型也記錄下來。這樣就實現了弱類型。
C語言的結構和聯合,以及PHP是怎麽實現弱類型的