1. 程式人生 > >C語言的結構和聯合,以及PHP是怎麽實現弱類型的

C語言的結構和聯合,以及PHP是怎麽實現弱類型的

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是怎麽實現弱類型的