PHP變數的實現原理【轉】

來源:互聯網
上載者:User

標籤:整數   對象   zend   表結構   資料庫   不能   padding   串連   檔案   

PHP是一門弱語言,也就說PHP的一個變數可以儲存任意類型的變數,PHP是用C語言實現的,而C語言是一個強型別的語言,每個變數都有固定的類型,不能隨意改變變數的類型(雖然可以通過強制類型轉換,可能會出問題)。在zend引擎中的實現:

引用的是PHP 5的源碼:

 

開啟zend.h 會發現定義了如下的結構體:

 

typedef struct _zval_struct     zval;

 

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;

zend_ast *ast;

} zvalue_value;

 

struct _zval_struct {

/* Variable information */

zvalue_value value; /* value */

zend_uint refcount__gc;

zend_uchar type; /* active type */

zend_uchar is_ref__gc;

 

};

其中 zval 就是PHP的變數的底層實現,zval是用結構體來實現的。

在zvalue_value中:

lval 是long類型資料,即是C語言中long。

dval 是double類型資料,即是C語言中double。

str  是一個結構體,成員變數var是char類型的指標,指向一個字元數組的首地址,為了資料安全,用len告訴系統要取多長的資料。

ht   是一個hash表結構,是為了儲存數組;

obj  是為了儲存物件類型;其中zend_object_value 就是zend為了儲存物件而定義的結構體。

ast  是PHP 5.6以後才有的,是為了儲存常量;

 

在_zval_struct中,

value  即是上述所說的zvalue_value,也就是儲存的資料;

refcount__gc 即是變數的引用數,變數引用計算機。

type 變數的類型,為了儲存當前所儲存的資料,是哪一個類型的資料;常用類型如下所示:

#define IS_NULL 0

#define IS_LONG 1

#define IS_DOUBLE 2

#define IS_BOOL 3

#define IS_ARRAY 4

#define IS_OBJECT 5

#define IS_STRING 6

 

#define IS_RESOURCE 7

 

is_ref__gc 變數是否被引用。

 

對變數類型的解析:

IS_NULL

0

IS_LONG

1

long類型變數

IS_DOUBLE

2

double類型變數

IS_BOOL

3

布爾變數

IS_ARRAY

4

數組

IS_OBJECT

5

對象

IS_STRING

6

字串

IS_RESOURCE

7

資源類型變數

 

關於資源類型的變數:資源類型是一種特殊的變數,儲存了到外部資源的一個引用。比如資料庫的串連,開啟檔案,圖形畫布地區;

資源類型本質上儲存是一個整數,也就是resource ID ,zend可以根據這個ID去找到最終所需要的資料;

例如:$file_source = fopen(“a.txt”,”r”);

可以用is_resource()函數測定一個變數是否是資源,函數get_resource_type()則返回該資源的類型。

關於變數的賦值會有 寫時複製機制。

PHP變數的實現原理【轉】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.