99久久国产露脸精品麻豆,欧美日韩精品小说,亚洲免费在线美女视频,国产三级中文字幕,91极品国产情侣高潮对白,国产亚洲一区二区三区不卡片,欧美jizz精品欧美性,久久国产精品久久国产片

PHP底層原理分析(一):PHP變量的底層實(shí)現(xiàn)

袁志蒙 8054次瀏覽

摘要:PHP是一種適用于web開發(fā)的動(dòng)態(tài)語言。具體點(diǎn)說,就是一個(gè)用C語言實(shí)現(xiàn)包含大量組件模塊的軟件框架。是一個(gè)強(qiáng)大的UI框架。簡言之;PHP動(dòng)態(tài)語言執(zhí)行過程:拿到一段代碼后,經(jīng)過詞法解析、語法解析等階段后,...

PHP是一種適用于web開發(fā)的動(dòng)態(tài)語言。具體點(diǎn)說,就是一個(gè)用C語言實(shí)現(xiàn)包含大量組件模塊的軟件框架。是一個(gè)強(qiáng)大的UI框架。

簡言之;PHP動(dòng)態(tài)語言執(zhí)行過程:拿到一段代碼后,經(jīng)過詞法解析、語法解析等階段后,源程序會(huì)被翻譯成一個(gè)個(gè)指令(opcodes),然后ZEND虛擬機(jī)順次執(zhí)行這些指令完成操作。PHP本身是用C實(shí)現(xiàn)的,因此最終調(diào)用的也是C的函數(shù),實(shí)際上,我們可以把PHP看做一個(gè)C開發(fā)的軟件。

一、PHP代碼的執(zhí)行過程:

編譯型語言:

對于C語言,C++, 編譯成機(jī)器碼(二進(jìn)制)來運(yùn)行.

java語言, 把.java編譯成 .class,稱為bytecode, 由jvm來運(yùn)行.

解釋語言:

解釋器解釋執(zhí)行. 典型的如 linux shell.

解釋器逐行來執(zhí)行命令.


PHP稍有特殊之處,雖然是一個(gè)腳本語言,但不是靠解釋器解釋,而是 zend 虛擬機(jī),屏蔽了操作系統(tǒng)的區(qū)別.php代碼編譯成opcode, 由zend虛擬機(jī)來執(zhí)行opcode.

但是---opcode, PHP腳本一結(jié)束,opcode就清除了.

思考:opcode能否緩存? 

PHP本身不支持,但是apc,xcache等加速器,實(shí)現(xiàn)了這樣的效果.

二、PHP變量的底層實(shí)現(xiàn):

下載PHP的源碼包,看到如下的目錄:

PHP底層原理分析(一)

其中,最核心的---Zend目錄, 這是zend虛擬的實(shí)現(xiàn). 包括棧,數(shù)據(jù)類型,編譯器等,都在這實(shí)現(xiàn).

最主要的main --PHP的一些內(nèi)建函數(shù),最主要函數(shù)都在這里放著.最大的一個(gè)目錄 ext -- PHP的擴(kuò)展.

PHP的大部分功能,都是以extenstion形式來完成的,如果你開發(fā)了一個(gè)擴(kuò)展,也放在ext目錄下.


在zend中,PHP變量是怎么實(shí)現(xiàn)的?

找到文件Zend/zend.h的第316行,PHP中的一個(gè)變量就是zval中的一個(gè)結(jié)構(gòu)體來描述的,如圖:

PHP底層原理分析(一)

結(jié)構(gòu)體的字段解釋:

struct _zval_struct {
	/* Variable information */
	zvalue_value value;	/*變量的值,是個(gè)聯(lián)合體*/
	zend_uint refcount__gc; /*指向次數(shù)*/
	zend_uchar type;	/* 變量類型 */
	zend_uchar is_ref__gc; /*是否引用*/
};

type字段的值為以下常量:

IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_OBJECT,IS_RESOURCE.


那具體的一個(gè)變量的值(上圖中的zvalue_value)是如何存放的,在第305行找到:

PHP底層原理分析(一)

我們發(fā)現(xiàn)在PHP中,字符串類型,長度是已經(jīng)緩存的,調(diào)用strlen時(shí),系統(tǒng)可以直接返回其長度,不必計(jì)算.

疑問:

PHP中有8種數(shù)據(jù)類型,為什么zval->value 聯(lián)合體中,只有5種?

答:

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

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

3: Resourc型 ,資源型往往是服務(wù)器上打開的一個(gè)接口,如果文件讀取接口.zval->type = IS_RESOURCE, zval->tyoe.lval = 服務(wù)器上打開的接口的編號

//如我們聲明一個(gè)變量,那么一個(gè)結(jié)構(gòu)體就產(chǎn)生了:
$a = 3;
{
value : [long lval = 3]
type: IS_LONG
}

$a = 3.5
{
value: [double dval = 3.5]
type:IS_DOUBLE
}


隨機(jī)內(nèi)容

表情

共0條評論
  • 這篇文章還沒有收到評論,趕緊來搶沙發(fā)吧~