PHP變數的實現

簡介

在官方的PHP實現內部,所有變數使用同一種數據結構(zval)來保存,而這個結構同時表示PHP中的各種數據類型。 它不僅僅包含變數的值,也包含變數的類型。這就是PHP弱類型的核心。

  • 標量類型: boolean、integer、float(double)、string

  • 複合類型: array、object

  • 特殊類型: resource、NULL

變數的存儲結構

PHP在內核中是通過zval這個結構體來存儲變數的,它的定義在Zend/zend.h文件里,簡短精鍊,只有四個成員組成:

struct _zval_struct { zvalue_value value;  zend_uint refcount__gc; zend_uchar type;  zend_uchar is_ref__gc;};typedef struct _zval_struct zval;//在Zend/zend_types.h里定義的:typedef unsigned int zend_uint;typedef unsigned char zend_uchar;
  • refcount__gc 表示引用計數 1

    Advertisements

  • is_ref__gc 表示是否為引用 0

  • value 存儲變數的值

  • type 變數具體的類型

變數的類型

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$foo = 'bar';?>

上面是一段PHP語言的例子,創建一個變數,並把它的值設置為』bar』,步驟: 創建一個zval結構,並設置其類型。 設置值為』bar』。 將其加入當前作用域的符號表,這樣用戶才能在PHP里使用這個變數 具體的代碼為:

Advertisements

{ zval *fooval; MAKE_STD_ZVAL(fooval); ZVAL_STRING(fooval, "bar", 1); ZEND_SET_SYMBOL( EG(active_symbol_table) , "foo" , fooval);} 

首先,我們聲明一個zval指針,並申請一塊內存。然後通過ZVAL_STRING宏將值設置為

<?php$foo = 'bar';?>
,最後一行的作用就是將這個zval加入到當前的符號表裡去,並將其label定義成foo,這樣用戶就可以在代碼里通過$foo來使用它。

備註

建議好好看看參考2的鏈接,裡面講了很多關於變數的知識。

參考

  1. http://www.laruence.com/2008/08/12/180.html

  2. https://www.kancloud.cn/nickbai/php7/363267

Advertisements

你可能會喜歡