摘要:局部變量中局部變量分配在結(jié)構(gòu)上,每次執(zhí)行都會(huì)生成一個(gè)新的,局部變量在執(zhí)行之初分配,然后在執(zhí)行結(jié)束時(shí)釋放,這是局部變量的生命周期。
1.局部變量
PHP中局部變量分配在zend_execute_data結(jié)構(gòu)上,每次執(zhí)行zend_op_array都會(huì)生成一個(gè)新的zend_execute_data,局部變量在執(zhí)行之初分配,然后在執(zhí)行結(jié)束時(shí)釋放,這是局部變量的生命周期。
讀寫(xiě)操作:局部變量通過(guò)編譯時(shí)確定的編號(hào)進(jìn)行讀寫(xiě)操作
2.靜態(tài)變量
靜態(tài)變量的保存位置:zend_op_array->static_variables,這是一個(gè)哈希表,所以PHP中的靜態(tài)變量與普通局部變量不同,它們沒(méi)有分配在執(zhí)行空間zend_execute_data上,而是以哈希表的形式保存在zend_op_array中。靜態(tài)變量只會(huì)初始化一次,注意:它的初始化發(fā)生在編譯階段而不是執(zhí)行階段,這個(gè)特性也意味著靜態(tài)變量初始的值不能是變量,比如:static $count = $xxx;這樣定義將會(huì)報(bào)錯(cuò)
讀寫(xiě)操作:首先根據(jù)變量名在static_variables中取出對(duì)應(yīng)的zval,然后將它修改為引用類(lèi)型并賦值給局部變量,也就是說(shuō)static $count = 4;包含了兩個(gè)操作,嚴(yán)格的將$count并不是真正的靜態(tài)變量,它只是一個(gè)指向靜態(tài)變量的局部變量,執(zhí)行時(shí)實(shí)際操作是:$count = & static_variables["count"];
3.全局變量
全局變量在整個(gè)請(qǐng)求執(zhí)行期間始終存在,它們保存在EG( executor_globals,Zend執(zhí)行器相關(guān)的全局變量)的symbol_table中,與靜態(tài)變量的存儲(chǔ)一樣,這也是一個(gè)哈希表,在zend_execute_ex執(zhí)行開(kāi)始之前會(huì)把當(dāng)前作用域下的所有全局變量添加到EG的symbol_table中.
讀寫(xiě)操作:與靜態(tài)變量的訪問(wèn)一樣,全局變量也是將原來(lái)的值轉(zhuǎn)換為引用,然后在global導(dǎo)入的作用域內(nèi)創(chuàng)建一個(gè)局部變量指向該引用
4.常量
常量存儲(chǔ)在EG的zend_constants哈希表中,訪問(wèn)時(shí)也是根據(jù)常量名直接到哈希表中查找
typedef struct _zend_constant { zval value; //常量值 zend_string *name; //常量名 } zend_constant;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28565.html
1.EG(executor_globals/zend_executor_globals) PHP整個(gè)生命周期中最主要的一個(gè)結(jié)構(gòu),是一個(gè)全局變量,在main執(zhí)行前分配(非ZTS下),直到PHP退出,它記錄著當(dāng)前請(qǐng)求全部的信息 showImg(https://segmentfault.com/img/bV8fW0?w=960&h=777); 2.EX(execute_data/zend_execut...
摘要:代碼的編譯的解析過(guò)程任務(wù)就是將代碼轉(zhuǎn)化為數(shù)組,代碼里的所有信息都保存在數(shù)組中,然后將數(shù)組交給引擎執(zhí)行,就是內(nèi)核具體執(zhí)行的命令,比如賦值加減操作函數(shù)調(diào)用等,每一條都對(duì)應(yīng)一個(gè)處理,這些是提前定義好的函數(shù)。 1.PHP代碼的編譯 PHP的解析過(guò)程任務(wù)就是將PHP代碼轉(zhuǎn)化為opcode數(shù)組,代碼里的所有信息都保存在opcode數(shù)組中,然后將opcode數(shù)組交給zend引擎執(zhí)行,opcode就是...
摘要:父類(lèi)方法為錯(cuò)誤,成員方法不得被重寫(xiě)。父子類(lèi)方法靜態(tài)屬性不一致父類(lèi)方法為非靜態(tài)而子類(lèi)的是靜態(tài)或相反,錯(cuò)誤。 1.類(lèi)的結(jié)構(gòu) 類(lèi)是編譯階段的產(chǎn)物,而對(duì)象是運(yùn)行時(shí)產(chǎn)生的,它們歸屬于不同階段。編譯完成后我們定義的每個(gè)類(lèi)都會(huì)生成一個(gè)zend_class_entry,它保存著類(lèi)的全部信息,在執(zhí)行階段所有類(lèi)相關(guān)的操作都是用的這個(gè)結(jié)構(gòu), struct _zend_class_entry { ch...
摘要:插入一個(gè)元素時(shí)先將元素按先后順序插入數(shù)組,位置是,再根據(jù)的哈希值映射到散列表中的某個(gè)位置,將存入這個(gè)位置查找時(shí)先在散列表中映射到,得到在數(shù)組的位置,再?gòu)臄?shù)組中取出元素。目前只有兩種類(lèi)型會(huì)使用這種機(jī)制。 1.變量結(jié)構(gòu) typedef struct _zval_struct zval; typedef union _zend_value { zend_long ...
摘要:編譯工具這個(gè)腳本主要生成了編譯需要的配置以及擴(kuò)展的基本結(jié)構(gòu)這個(gè)腳本主要是獲取的安裝信息用于生成文件編寫(xiě)擴(kuò)展的基本步驟通過(guò)目錄下腳本生成擴(kuò)展的基本框架修改配置設(shè)置編譯配置參數(shù)設(shè)置擴(kuò)展的源文件依賴(lài)庫(kù)函數(shù)檢查等等定義一個(gè)這樣的編譯參數(shù) 1. 編譯工具 (a).ext_skel:這個(gè)腳本主要生成了編譯需要的配置以及擴(kuò)展的基本結(jié)構(gòu) (b).php-config:這個(gè)腳本主要是獲取PHP的安裝信息...
閱讀 1276·2021-11-24 09:39
閱讀 1533·2021-09-07 09:59
閱讀 3490·2019-08-30 15:54
閱讀 2485·2019-08-30 11:00
閱讀 2678·2019-08-29 15:06
閱讀 2168·2019-08-26 13:52
閱讀 438·2019-08-26 13:24
閱讀 2504·2019-08-26 12:20