成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

(PHP7內(nèi)核剖析-4) 局部變量,全局變量,常量

yagami / 3123人閱讀

摘要:局部變量中局部變量分配在結(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

相關(guān)文章

  • (PHP7內(nèi)核剖析-7) Zend引擎執(zhí)行過(guò)程

    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...

    elisa.yang 評(píng)論0 收藏0
  • (PHP7內(nèi)核剖析-5) PHP代碼的編譯

    摘要:代碼的編譯的解析過(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就是...

    DevTTL 評(píng)論0 收藏0
  • (PHP7內(nèi)核剖析-8) 類(lèi)

    摘要:父類(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...

    JohnLui 評(píng)論0 收藏0
  • (PHP7內(nèi)核剖析-3) 變量

    摘要:插入一個(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 ...

    RiverLi 評(píng)論0 收藏0
  • (PHP7內(nèi)核剖析-11) 模塊擴(kuò)展

    摘要:編譯工具這個(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的安裝信息...

    gplane 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<