本文目錄一覽:
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-hant/n/248956.html