深入理解PHP核心(五)變數及資料類型-變數的結構和類型,深入理解核心_PHP教程

來源:互聯網
上載者:User

深入理解PHP核心(五)變數及資料類型-變數的結構和類型,深入理解核心


原文連結:http://www.orlion.ga/238/

程式設計語言的類型可以分為強型別和弱類型兩種,PHP是弱類型語言,但是C語言是強型別語言。在官網PHP實現內部,所有變數使用同一種資料結構(zval)來儲存,這個結構表示PHP中的各種資料類型,它不僅包含變數的值,也包含變數的類型。這就是PHP弱類型的核心。

那zval結構是如何?弱類型的呢?

一、PHP變數類型及儲存結構

PHP在聲明和使用變數的時候,並不需要指明其資料類型,PHP是弱類型語言,但是PHP有類型,PHP有八中資料類型,可以分成三類:標量類型:boolean、integer、float(double) string;複合類型:array、object;特殊類型:resource、NULL

C語言是如何?PHP中的弱類型的呢?

1、變數儲存結構

變數的值儲存到如下所示的zval結構體中,zval結構體定義在Zend/zend.h檔案,其結構如下:

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;};

zval結構體中有四個欄位,其含義分別為:

屬性名稱 含義 預設值
refcount_gc 表示引用計數 1
is_ref_gc 表示是否為引用 0
value 儲存變數的值
type 變數具體的類型

在PHP5.3之後,引入了新的記憶體回收機制,引用計數和引用的欄位名改為refcout_gc和is_ref_gc在此之前為refcount和is_ref.

變數的值儲存在另外一個結構體zvalue_value,值儲存見下面的介紹。

2、變數類型

zval結構體的type欄位就是實現弱類型最關鍵的欄位了,type的值可以為:IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_OBJECT和IS_RESOURCE之一。除此之外和它們定義在一起的類型還有IS_CONSTANT、IS_CONSTANT_ARRAY。

二、變數的值儲存

前面提到變數的值儲存在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;

各種類型的資料會使用不同的方法來進行變數值的儲存,其對應賦值方式如下:

一般類型:

變數類型
boolean ZVAL_BOOL

布爾型/整型的變數值儲存於(zval).value.lval中,其類型也會

以相應的IS_*進行儲存

integer ZVAL_LONG
float ZVAL_DOUBLE Z_TYPE_P(z)=IS_BOOL/LONG;Z_LVAL_P(z)=(b)!=0;
null ZVAL_NULL

NULL值的變數值不需要儲存,只需要把(zval).type標為IS_NUL

Z_TYPE_P(z)=IS_NULL;

resource ZVAL_RESOURCE

資源類型的儲存與其他一般變數無異,但其初始化及儲存實現則不

同Z_TYPE_P(z) = IS_RESOURCE; Z_LVAL_P(z) = 1;

字串

字串的類型標示和其他資料類型一樣,不過在儲存字串時多了一個字串長度的欄位。

struct {    char *val;    int len;} str;

(儲存字串長度是因為字串的操作十分頻繁,有利於節省時間,是空間換時間的做法)

數組Array

數組是PHP中最常用也是最強大變數類型。數組的值儲存在zvalue_value.ht欄位中,它是一個HashTable類型的資料。PHP數組使用雜湊表來儲存關聯資料。PHP的雜湊表實現中使用了兩個資料結構HashTable和Bucket。PHP所有的工作都是由雜湊表實現。

對象Object

PHP的對象是一種複合型的資料,使用一種zend_object_value的結構體來存放,其定義如下

typedef struct _zend_object_value {    zend_object_handle handle;  //  unsigned int類型,EG(objects_store).object_buckets的索引    zend_object_handlers *handlers;} zend_object_value;

PHP的對象只有在運行時才會被建立,前面介紹了EG宏,這是一個全域結構體由於儲存在運行時的資料。其中就包括了用來儲存所有被建立的對象的對象池,EG(objects_store),而object對象值內容的zend_object_handle域就是當前對象在對象池中所在的索引,handlers欄位則是將對象進行操作時的處理函數儲存起來。

PHP的弱變數容器的實現方式是相容並包的形式體現。

http://www.bkjia.com/PHPjc/1113138.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1113138.htmlTechArticle深入理解PHP核心(五)變數及資料類型-變數的結構和類型,深入理解核心 原文連結:http://www.orlion.ga/238/ 程式設計語言的類型可以分為強型別和弱類...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.