日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— 變量存儲與類型

瀏覽:150日期:2022-09-16 13:53:13

先回答前面一節的那個問題吧。

<?php$foo = 10;$bar = 20;function change() { global $foo;//echo ’函數內部$foo = ’.$foo.’<br />’;//如果不把$bar定義為global變量,函數體內是不能訪問$bar的 $bar = 0; $foo++;}change();echo $foo, ’ ’, $bar;?>

程序輸出 11 20。原因是,方法內部無法訪問$bar變量,所以它的值還是20。使用global之后,可以取得$foo的值,自增后$foo的值就是11。

Global的作用是定義全局變量,但是這個全局變量不是應用于整個網站,而是應用于當前頁面,包括include或require的所有文件。

前言中提到變量的三個基本特性,其中的有一個特性為變量的類型,變量都有特定的類型, 如:字符串、數組、對象等等。編程語言的類型系統可以分為強類型和弱類型兩種:

強類型語言是一旦某個變量被申明為某個類型的變量,則在程序運行過程中,該不能將該變量的類型以外的值賦予給它 (當然并不完全如此,這可能會涉及到類型的轉換,后面的小節會有相應介紹),C/C++/Java等語言就屬于這類。

PHP及Ruby,JavaScript等腳本語言屬于弱類型語言:一個變量可以表示任意的數據類型。

PHP之所以成為一個簡單而強大的語言,很大一部分的原因是它擁有弱類型的變量。 但是有些時候這也是一把雙刃劍,使用不當也會帶來一些問題。就像儀器一樣,越是功能強大, 出現錯誤的可能性也就越大。

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

那zval結構具體是如何實現弱類型的呢,下面我們一起來揭開面紗。

變量存儲結構

PHP在聲明或使用變量的時候,并不需要顯式指明其數據類型。

PHP是弱類型語言,這并不表示PHP沒有類型,在PHP中,存在8種變量類型,可以分為三類

* 標量類型:boolean、integer、float(double)、string* 復合類型:?array、object* 特殊類型:?resource、NULL

官方PHP是用C實現的,而C是強類型的語言,那這是怎么實現PHP中的弱類型的呢?

變量的值存儲到以下所示zval結構體中。 zval結構體定義在Zend/zend.h文件,其結構如下:

typedef struct _zval_struct zval;...struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc;};

PHP使用這個結構來存儲變量的所有數據。和其他編譯性靜態語言不同, PHP在存儲變量時將PHP用戶空間的變量類型也保存在同一個結構體中。這樣我們就能通過這些信息獲取到變量的類型。

zval結構體中有四個字段,其含義分別為:

屬性名含義默認值refcount__gc表示引用計數1is_ref__gc表示是否為引用0value存儲變量的值type變量具體的類型

在PHP5.3之后,引入了新的垃圾收集機制,引用計數和引用的字段名改為refcount__gc和is_ref__gc。在此之前為refcount和is__ref。

而變量的值則存儲在另外一個結構體zvalue_value中。值存儲見下面的介紹。

PHP用戶空間指的在PHP語言這一層面,而本書中大部分地方都在探討PHP的實現。 這些實現可以理解為內核空間。由于PHP使用C實現,而這個空間的范疇就會限制在C語言。 而PHP用戶空間則會受限于PHP語法及功能提供的范疇之內。 例如有些PHP擴展會提供一些PHP函數或者類,這就是向PHP用戶空間導出了方法或類。

變量類型

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。

這和我們設計數據庫時的做法類似,為了避免重復設計類似的表,使用一個標示字段來記錄不同類型的數據。

變量的值存儲

前面提到變量的值存儲在zvalue_value聯合體中,結構體定義如下:

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;} zvalue_value;

這里使用聯合體而不是用結構體是出于空間利用率的考慮,因為一個變量同時只能屬于一種類型。 如果使用結構體的話將會不必要的浪費空間,而PHP中的所有邏輯都圍繞變量來進行的,這樣的話, 內存浪費將是十分大的。這種做法成本小但收益非常大。

各種類型的數據會使用不同的方法來進行變量值的存儲,其對應賦值方式如下:

1. 一般類型

變量類型宏?booleanZVAL_BOOL布爾型/整型的變量值存儲于(zval).value.lval中,其類型也會以相應的IS_*進行存儲。 Z_TYPE_P(z)=IS_BOOL/LONG; Z_LVAL_P(z)=((b)!=0);integerZVAL_LONGfloatZVAL_DOUBLEnullZVAL_NULLNULL值的變量值不需要存儲,只需要把(zval).type標為IS_NULL。 Z_TYPE_P(z)=IS_NULL;resourceZVAL_RESOURCE資源類型的存儲與其他一般變量無異,但其初始化及存取實現則不同。 Z_TYPE_P(z) = IS_RESOURCE; Z_LVAL_P(z) = l;

2. 字符串Sting

字符串的類型標示和其他數據類型一樣,不過在存儲字符串時多了一個字符串長度的字段。

struct { char *val; int len;} str;

C中字符串是以0結尾的字符數組,這里多存儲了字符串的長度,這和我們在設計數據庫時增加的冗余字段異曲同工。 因為要實時獲取到字符串的長度的時間復雜度是O(n),而字符串的操作在PHP中是非常頻繁的,這樣能避免重復計算字符串的長度, 這能節省大量的時間,是空間換時間的做法。 這么看在PHP中strlen()函數可以在常數時間內獲取到字符串的長度。 計算機語言中字符串的操作都非常之多,所以大部分高級語言中都會存儲字符串的長度。

3. 數組Array

數組是PHP中最常用,也是最強大變量類型,它可以存儲其他類型的數據,而且提供各種內置操作函數。數組的存儲相對于其他變量要復雜一些, 數組的值存儲在zvalue_value.ht字段中,它是一個HashTable類型的數據。 PHP的數組使用哈希表來存儲關聯數據。哈希表是一種高效的鍵值對存儲結構。PHP的哈希表實現中使用了兩個數據結構HashTable和Bucket。 PHP所有的工作都由哈希表實現,在下節HashTable中將進行哈希表基本概念的介紹以及PHP的哈希表實現。

4. 對象Object

在面向對象語言中,我們能自己定義自己需要的數據類型,包括類的屬性,方法等數據。而對象則是類的一個具體實現。 對象有自身的狀態和所能完成的操作。

PHP的對象是一種復合型的數據,使用一種zend_object_value的結構體來存放。其定義如下:

typedef struct _zend_object_value { zend_object_handle handle; // unsigned int類型,EG(objects_store).object_buckets的索引 zend_object_handlers *handlers;} zend_object_value;

PHP的對象只有在運行時才會被創建,前面的章節介紹了EG宏,這是一個全局結構體用于保存在運行時的數據。 其中就包括了用來保存所有被創建的對象的對象池,EG(objects_store),而object對象值內容的zend_object_handle域就是當前 對象在對象池中所在的索引,handlers字段則是將對象進行操作時的處理函數保存起來。 這個結構體及對象相關的類的結構_zend_class_entry,后面會介紹到。

PHP的弱變量容器的實現方式是兼容并包的形式體現,針對每種類型的變量都有其對應的標記和存儲空間。 使用強類型的語言在效率上通常會比弱類型高,因為很多信息能在運行之前就能確定,這也能幫助排除程序錯誤。 而這帶來的問題是編寫代碼相對會受制約。

PHP主要的用途是作為Web開發語言,在普通的Web應用中瓶頸通常在業務和數據訪問這一層。不過在大型應用下語言也會是一個關鍵因素。 facebook因此就使用了自己的php實現。將PHP編譯為C++代碼來提高性能。不過facebook的hiphop并不是完整的php實現, 由于它是直接將php編譯為C++,有一些PHP的動態特性比如eval結構就無法實現。當然非要實現也是有方法的, hiphop不實現應該也是做了一個權衡。

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产高清视频一区二区| 99国产精品视频免费观看一公开 | 日韩av一区二区在线影视| 亚洲激情久久| 在线精品视频在线观看高清| 精品一区毛片| 国产精品美女| 欧美一级一区| 亚洲一二三区视频| 日韩国产在线不卡视频| 久久精品九色| 99国产精品私拍| 国产精品蜜月aⅴ在线| 伊人久久高清| 亚洲狼人精品一区二区三区| 国产精品主播在线观看| 精精国产xxxx视频在线野外| 欧美资源在线| 久久三级毛片| 在线亚洲精品| 美女性感视频久久| 婷婷综合网站| 日韩精品视频在线看| 色综合五月天| 综合一区av| 国产欧洲在线| 亚洲精品乱码日韩| 日本精品在线中文字幕| 日韩精品免费视频一区二区三区| 国产中文字幕一区二区三区| 中文在线不卡| 精品视频一区二区三区在线观看| 夜久久久久久| 久久男人av资源站| 午夜日韩影院| 亚洲午夜电影| 久久av免费| 在线国产日韩| 日韩在线欧美| 欧美亚洲国产日韩| 久久国产电影| 欧美91在线| 蜜桃91丨九色丨蝌蚪91桃色 | 国产美女高潮在线| 日韩精品免费视频人成| 99精品网站| 久久精品国产成人一区二区三区| 免费日韩av片| 91精品亚洲| 精品美女久久| 欧美一区在线观看视频| 亚洲成人日韩| 国产精品麻豆久久| 国产伦精品一区二区三区在线播放| 亚洲女同一区| 综合日韩av| 麻豆精品少妇| 亚洲va久久久噜噜噜久久| 亚洲天堂久久| av免费不卡国产观看| 久久国产婷婷国产香蕉| 日韩一区精品字幕| 欧美91福利在线观看| 久久久久久久欧美精品| 日韩成人午夜精品| 麻豆亚洲精品| 亚洲二区免费| 国产成人久久精品一区二区三区| 亚欧成人精品| 久久福利毛片| 日韩精品久久理论片| 亚洲色图综合| 另类激情亚洲| 亚洲一区二区免费看| 久久激情中文| 欧产日产国产精品视频| 精品国产亚洲一区二区三区在线 | 亚洲精品国产嫩草在线观看| 精品在线网站观看| 国产精品一区二区精品| 亚洲理论在线| 亚洲欧美高清| 亚洲一区二区三区高清| 黄色精品网站| 亚洲激情国产| 欧美日韩四区| 伊人久久亚洲影院| 午夜av一区| 国产亚洲在线观看| 日韩制服丝袜av| 久久国产精品久久w女人spa| 欧美日韩国产欧| 亚洲一区二区三区四区五区午夜| 国产尤物精品| 亚洲调教视频在线观看| 久久国产小视频| 在线日韩中文| 夜久久久久久| 蜜臀av在线播放一区二区三区| 亚洲激情av| 首页亚洲欧美制服丝腿| 亚洲tv在线| 久久国产三级精品| 国产精品115| 精品国产亚洲一区二区三区在线 | 欧美亚洲国产一区| 久久人人97超碰国产公开结果| 在线看片国产福利你懂的| 丁香六月综合| 视频福利一区| 欧美精品激情| 日韩中文字幕一区二区高清99| 日本99精品| 精品日韩一区| 久久久久蜜桃| 99热精品在线| 中文字幕av一区二区三区四区| 日韩精品成人在线观看| 国产精品视频一区二区三区| 岛国精品一区| 久久久久久久久丰满| av不卡免费看| 91麻豆精品| 国产精品一区二区精品| 色综合五月天| aa亚洲婷婷| 国产女人18毛片水真多18精品| 精品高清久久| 欧美精品一二| 97精品国产福利一区二区三区| 国产精品av久久久久久麻豆网| 亚洲一二av| 久久精品国产成人一区二区三区| 香蕉成人av| 久久香蕉精品| 国产精品男女| 99国产精品久久久久久久| 日韩高清一区二区| 成人精品动漫一区二区三区| 激情六月综合| 日本a级不卡| 波多野结衣久久精品| 黄色亚洲大片免费在线观看| 久久激情av| 久久一区二区三区喷水| 天堂va在线高清一区| 国产资源在线观看入口av| 国产女优一区| 久久精品系列| 久久xxxx| 日产精品一区二区| av成人国产| 精品国产中文字幕第一页| 欧美日韩三区| 美女毛片一区二区三区四区最新中文字幕亚洲| 日韩欧美字幕| 日韩欧美2区| 欧美sss在线视频| 日韩国产欧美一区二区三区| 成人日韩在线观看| 日韩精品成人在线观看| 色88888久久久久久影院| 日韩综合一区二区| 成人久久久久| 国产精品中文字幕制服诱惑| 欧美日韩免费观看一区=区三区| 久久精品99久久久| 国产在线日韩| 美女精品视频在线| 最新亚洲国产| 91精品久久久久久久久久不卡| 欧美亚洲网站| 狠狠爱成人网| 亚洲女同av| 国产人成精品一区二区三| 黑丝美女一区二区| 成人精品高清在线视频| 日韩在线观看一区二区三区| 久久久777| 国产精品探花在线观看| 午夜宅男久久久| 色爱综合网欧美| 欧美中文高清| 久久aⅴ国产紧身牛仔裤| 热三久草你在线| 国产极品模特精品一二| 亚洲一区有码| 婷婷精品进入| 久久久777| 中文字幕高清在线播放| 你懂的国产精品| 日韩精品视频在线看| 一本色道久久精品| 日韩欧美一区二区三区免费观看| 国产精品久久久久久久免费软件 | 三级久久三级久久久| 亚洲高清激情| 日韩深夜视频| 精品三级国产| 国产精品久久久网站|