首頁  >  文章  >  後端開發  >  php變數是如何實現的

php變數是如何實現的

coldplay.xixi
coldplay.xixi原創
2020-08-21 11:15:071890瀏覽

php變數的實作方法:先宣告一個zval指針,並申請一塊記憶體;然後透過【ZVAL_STRING】巨集將值設為bar;最後是將這個zval加入到目前的符號表裡去,並將其label定義成foo。

php變數是如何實現的

【相關學習推薦:php圖文教學

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

  • #is_ref__gc 表示是否為引用0

  • value 儲存變數的值

  • ##type 變數具體的型別

#變數的型別

zval結構體的type字段就是實作弱型別最關鍵的字段,type的值可以是:

IS_NULLIS_BOOLIS_LONGIS_DOUBLEIS_STRINGIS_ARRAYIS_OBJECTIS_RESOURCE。從字面上就很好理解,他們只是類型的唯一標示,根據類型的不同將不同的值儲存到value欄位。除此之外,和他們定義在一起的型別還有IS_CONSTANTIS_CONSTANT_ARRAY

範例

<?php
$foo = &#39;bar&#39;;
?>

上面是一段PHP語言的例子,建立一個變量,並把它的值設為'bar',步驟: 建立一個zval結構,並設定其類型。設定值為'bar'。將其加入目前作用域的符號表,這樣使用者才能在PHP裡使用這個變數 具體的程式碼為:

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

首先,我們宣告一個zval指針,併申請一塊記憶體。然後透過ZVAL_STRING巨集將值設為bar,最後一行的作用就是將這個zval加入到目前的符號表裡去,並將其label定義成foo,這樣使用者就可以在程式碼裡透過$foo來使用它。

相關學習推薦:

php程式設計(影片)

#

以上是php變數是如何實現的的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn