聊聊php數組底層是如何實現的(php數組是怎麼實現的)

本文目錄一覽:

PHP的數組底層是怎麼實現的

PHP之所以發現這麼迅速,有很大原因是因為數組數據非常好處理,而且它可以存儲其他類型的數據

數組的值存儲在zvalue_value.ht欄位中,ht是一個HashTable的數據

有關於HashTable的知識請移步 HASH表和變數

我們來詳細說一下數組

PHP裡面所有的數據都離不開zval和HashTable,

一個PHP很簡單的數組初始化,

在C語言裡面實現的卻沒有那麼簡單.

經過簡單分析,找到數組的初始化的opcode

求各位大神幫幫忙,PHP $_post 數組 怎麼實現

有點沒看明白你提問的目的!

php數組的定義很寬泛,不需要預先定義變數,可以直接存放數據,有兩種形式:索引數組(不指定鍵,系統自動分配數字鍵)、關聯數組(自定義鍵,指定鍵)!

例如:想要獲得如下結構的二維數組(關聯數組)

[

  ‘A’ = [

        ‘type’ = ‘TYPE_SINGLE’, 

        ‘day’ = ‘DAY May 12’

        ], 

  ‘B’ = [

        ‘type’ = ‘TYPE SINGLE_2’, 

        ‘day’ = ‘DAY May 13’

        ],

  ‘C’ = [

        ‘type’ = ‘TYPE SINGLE_3’, 

        ‘day’ = ‘DAY May 14’

        ]

]

php定義代碼:

//第1種

$abc = [

  ‘A’ = [

        ‘type’ = ‘TYPE_SINGLE’, 

        ‘day’ = ‘DAY May 12’

        ], 

  ‘B’ = [

        ‘type’ = ‘TYPE SINGLE_2’, 

        ‘day’ = ‘DAY May 13’

        ],

  ‘C’ = [

        ‘type’ = ‘TYPE SINGLE_3’, 

        ‘day’ = ‘DAY May 14’

        ]

];

//第2種

$abc2 = [];//定義並重置變數,此行可不寫

$abc2[‘A’][‘type’] = ‘TYPE_SINGLE’;

$abc2[‘A’][‘day’] = ‘DAY May 12’;

$abc2[‘B’][‘type’] = ‘TYPE_SINGLE_2’;

$abc2[‘B’][‘day’] = ‘DAY May 13’;

$abc2[‘C’][‘type’] = ‘TYPE SINGLE_3’;

$abc2[‘C’][‘day’] = ‘DAY May 14’;

//第3種(1、2的混合用法)

$abc3[‘A’] = [‘type’ = ‘TYPE_SINGLE’, ‘day’ = ‘DAY May 12’];

$abc3[‘B’] = [‘type’ = ‘TYPE_SINGLE_2’, ‘day’ = ‘DAY May 13’];

$abc3[‘C’] = [‘type’ = ‘TYPE_SINGLE_3’, ‘day’ = ‘DAY May 14’];

以上三種寫法是常用寫法,還有其他形式,php數組功能很強大,可以存放任意數據類型,寫法也很隨意!$abc、$abc2、$abc3 數據結構相同,但是$abc會重置內部結構。

註:$_POST 是全局變數,適合從中獲取(請求)數據,不建議你修改其內部數據結構,防止鍵名衝突,破壞全局變數的結構。如果你修改了$_POST,的確,$_POST[‘A’][‘type’] 能得到字元串’TYPE_SINGLE’!

PHP變數的底層實現

我們解壓PHP的源碼包, 看到如下的目錄

其中,

最核心的—Zend目錄, 這是zend虛擬的實現. 包括棧,數據類型,編譯器等,都在這實現.

最主要的main –PHP的一些內建函數,最主要函數都在這裡放著.

最大的一個目錄ext — PHP的擴展.

PHP的大部分功能,都是以extenstion形式來完成的.

如果你開發了一個擴展,也放在ext目錄下.

Zend對變數的表示:

答: zend實現了 zval結構體

{

value: [聯合體] ,聯合體的內容可能是C語言中的long,double,hashtable…

type:變數類型 , IS_NULL,IS_BOOL,IS_STRING…… IS_RESOURCE

refcount_gc

is_ref_gc

}

如:

$a = 3;

{

value : [long lval = 3]

type: IS_LONG

}

$a = 3.5

{

value: [double dval = 3.5]

type:IS_DOUBLE

疑問:

PHP中有8種數據類型,為什麼zval-value 聯合體中,只有5種?

答:

1: NULL,直接 zval-type = IS_NULL,就可以表示,不必設置  value的值.

2: BOOL型 , zval-type = IS_BOOL, 再設置 zval.value.lval = 1/0;

3: Resourc型 ,資源型 往往是伺服器上打開的一個介面,如果 文件讀取介面.

zval-type = IS_RESOURCE, zval-tyoe.lval =伺服器上打開的介面的編號

發現:

PHP中,字元串類型,長度是已經緩存的,調用strlen時,系統可以直接返回其長度,不必計算.

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248956.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:30
下一篇 2024-12-12 13:30

相關推薦

  • Python導入數組

    本文將為您詳細闡述Python導入數組的方法、優勢、適用場景等方面,並附上代碼示例。 一、numpy庫的使用 numpy是Python中一個強大的數學庫,其中提供了非常豐富的數學函…

    編程 2025-04-29
  • Python返回數組:一次性搞定多種數據類型

    Python是一種多用途的高級編程語言,具有高效性和易讀性的特點,因此被廣泛應用於數據科學、機器學習、Web開發、遊戲開發等各個領域。其中,Python返回數組也是一項非常強大的功…

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Python去掉數組的中括弧

    在Python中,被中括弧包裹的數據結構是列表,列表是Python中非常常見的數據類型之一。但是,有些時候我們需要將列表展開成一維的數組,並且去掉中括弧。本文將為大家詳細介紹如何用…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Django ORM如何實現或的條件查詢

    在我們使用Django進行資料庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Python二維數組對齊輸出

    本文將從多個方面詳細闡述Python二維數組對齊輸出的方法與技巧。 一、格式化輸出 Python中提供了格式化輸出的方法,可以對輸出的字元串進行格式化處理。 names = [‘A…

    編程 2025-04-29
  • Java創建一個有10萬個元素的數組

    本文將從以下方面對Java創建一個有10萬個元素的數組進行詳細闡述: 一、基本介紹 Java是一種面向對象的編程語言,其強大的數組功能可以支持創建大規模的多維數組以及各種複雜的數據…

    編程 2025-04-28
  • Python數組隨機分組用法介紹

    Python數組隨機分組是一個在數據分析與處理中常用的技術,它可以將一個大的數據集分成若干組,以便於進行處理和分析。本文將從多個方面對Python數組隨機分組進行詳細的闡述,包括使…

    編程 2025-04-28
  • Python數組索引位置用法介紹

    Python是一門多用途的編程語言,它有著非常強大的數據處理能力。數組是其中一個非常重要的數據類型之一。Python支持多種方式來操作數組的索引位置,我們可以從以下幾個方面對Pyt…

    編程 2025-04-28

發表回復

登錄後才能評論