成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:114日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人深夜在线观看| 欧美涩涩网站| 色综合一个色综合亚洲| 国产精品不卡视频| 在线中文字幕一区二区| 成人夜色视频网站在线观看| 精品精品欲导航| 国产乱码精品| 欧美69视频| 蜜桃av一区二区| 日韩美女久久久| 日韩视频不卡中文| 亚洲一区二区伦理| 99视频一区二区| 午夜电影网一区| 亚洲国产高清在线| 欧美二区在线观看| 亚洲欧美久久久| 欧美精品二区| 国产二区国产一区在线观看| 亚洲综合色婷婷| 欧美不卡在线视频| 久久精品午夜| 亚洲精品国产日韩| 99国产精品久久久久久久久久久 | 一本久久综合亚洲鲁鲁五月天 | 国内精品久久久久国产盗摄免费观看完整版 | 国产欧美精品一区| 欧美一区二区视频在线观看2022| 一区二区三区四区国产| 成人免费观看视频| 韩日av一区二区| 亚洲第一搞黄网站| 亚洲免费伊人电影| 国产精品久久久久永久免费观看| 日韩精品中文字幕一区 | 国产精品久久久久桃色tv| 欧美一二三四在线| 色婷婷综合在线| 美女黄网久久| 久久久夜夜夜| 久久久精彩视频| 国产亚洲精品bv在线观看| 女人色偷偷aa久久天堂| 国产suv精品一区二区883| 九九在线精品视频| 久久er99精品| 精品在线亚洲视频| 久久99久久久久久久久久久| 青青草国产成人99久久| 美女高潮久久久| 麻豆国产91在线播放| 午夜电影一区二区三区| 伊人夜夜躁av伊人久久| 一区二区三区在线免费播放| 亚洲精选在线视频| 伊人婷婷欧美激情| 图片区小说区区亚洲影院| 秋霞成人午夜伦在线观看| 毛片av一区二区三区| 国内精品国产成人国产三级粉色| 国产精品一二三区| 99久久综合国产精品| 欧美视频福利| 亚洲毛片播放| 色欲综合视频天天天| 欧美高清视频在线高清观看mv色露露十八| 91麻豆精品国产91久久久使用方法| 欧美视频在线一区| 欧美一级高清片| 久久综合狠狠综合久久综合88| 久久先锋资源网| 亚洲视频资源在线| 视频一区视频二区中文| 久久99久久久久| 99国产欧美另类久久久精品 | 日韩欧美亚洲另类制服综合在线 | 国产乱一区二区| 91社区在线播放| 一本色道久久99精品综合| 亚洲在线免费| 欧美日韩不卡一区二区| 91精品国产丝袜白色高跟鞋| 久久久一二三| 爽好多水快深点欧美视频| 欧美日韩精品一区二区在线播放 | 视频在线在亚洲| 精品女同一区二区| 91久久精品www人人做人人爽| 亚洲欧洲一区二区天堂久久| 99re66热这里只有精品4| 欧美成人性福生活免费看| 亚洲国产成人av网| jlzzjlzz亚洲女人18| 午夜精品一区二区三区免费视频 | 国产成人av福利| 欧美精品成人| 久久国产福利| 在线不卡一区二区| 欧美日本亚洲韩国国产| 性欧美疯狂xxxxbbbb| 欧美不卡视频一区| 亚洲一区二区高清视频| 波多野结衣精品在线| 国产精品一区二区三区99| 国产精品久久久久久久免费软件| 2021国产精品久久精品| 日本不卡高清视频| 亚洲久色影视| 国产日产欧美一区二区三区| 九一九一国产精品| 日本伊人精品一区二区三区观看方式| 国产中文字幕一区| 国产精品一区二区三区观看| 欧美大片国产精品| 爽爽淫人综合网网站| 在线成人国产| 欧美日韩精品一本二本三本| 日韩综合一区二区| 久久久美女毛片| 欧美在线一二三| 激情婷婷欧美| 丁香五精品蜜臀久久久久99网站 | 欧美日韩免费观看一区三区| 亚洲成av人片在线| 在线一区免费观看| 精品国产露脸精彩对白| 中文字幕亚洲成人| 色综合色综合色综合色综合色综合| 一区二区三区欧美成人| 国产午夜亚洲精品理论片色戒| 紧缚奴在线一区二区三区| 美女国产一区二区| 一二三四区精品视频| 久久久不卡网国产精品二区| 欧美日韩精品三区| 国产日韩欧美三区| 91欧美一区二区| 国产在线日韩欧美| 午夜精品福利一区二区蜜股av| 国产一区二区三区久久| 亚洲精品国产精品乱码不99 | 欧美蜜桃一区二区三区| 无吗不卡中文字幕| 久久午夜电影| 色综合天天综合狠狠| 欧美国产日韩精品免费观看| 午夜性色一区二区三区免费视频 | 老司机精品视频网站| 欧美1级日本1级| 国产福利一区在线观看| 青椒成人免费视频| 亚洲一区二区3| 久久午夜激情| 日本一二三四高清不卡| 99精品国产99久久久久久白柏| 26uuu色噜噜精品一区| 99re热这里只有精品视频| 国产一区二区不卡在线| 91在线码无精品| 国产精品三级在线观看| 在线国产欧美| 一区二区三区四区不卡在线| 宅男噜噜噜66国产日韩在线观看| 夜夜操天天操亚洲| 国产欧美一区二区三区另类精品 | 日韩专区一卡二卡| 欧美丰满一区二区免费视频| 国产suv精品一区二区6| 国产拍揄自揄精品视频麻豆| 亚洲第一毛片| 午夜精品福利在线| 欧美一卡二卡三卡四卡| 91天堂素人约啪| 亚洲天天做日日做天天谢日日欢| 国产视频欧美| 国产最新精品精品你懂的| 日韩你懂的在线观看| 欧美成人69av| 亚洲成va人在线观看| 欧美高清www午色夜在线视频| 国产成人免费视频网站| 国产欧美日韩综合| 久久亚洲美女| 99视频在线观看一区三区| 尤物视频一区二区| 欧美日韩免费一区二区三区视频| 成人免费视频播放| 亚洲免费在线播放| 欧美日韩精品系列| 一区二区视频在线观看| 青青草97国产精品免费观看无弹窗版 | 欧美男女性生活在线直播观看| 99久久精品国产导航| 亚洲成a人片在线观看中文| 欧美成人三级在线| 久久久久在线| 国产精品豆花视频| 国产精品91一区二区| 亚洲成人一二三|