摘要:每種程序語(yǔ)言都有自己的作用域?qū)崿F(xiàn),的作用域是怎么實(shí)現(xiàn)的呢先看一段代碼。那在底層是怎么實(shí)現(xiàn)這樣的效果的引擎本身有結(jié)構(gòu),該結(jié)構(gòu)中的是全局符號(hào)表,其中保存了頂層作用域的變量也就是全局變量。那局部變量呢其實(shí)每個(gè)函數(shù)都有一個(gè)自己的符號(hào)表。
每種程序語(yǔ)言都有自己的作用域?qū)崿F(xiàn),php的作用域是怎么實(shí)現(xiàn)的呢?
先看一段php代碼。
$bar = "out"; function scope(){ $bar = "inner"; echo $bar."< >"; } scope();
這段代碼的輸出很簡(jiǎn)單:
root@forse:~/learn$ php a.php inner
為什么會(huì)是這樣的輸出,我相信只要稍微懂點(diǎn)php或者編程的人就明白。那在php底層是怎么實(shí)現(xiàn)這樣的效果的?
Zend引擎本身有_zend_executor_globals結(jié)構(gòu),該結(jié)構(gòu)中的symptom_table是全局符號(hào)表,其中保存了頂層作用域的變量也就是全局變量。但程序需要使用全局變量的時(shí)候舊在這個(gè)符號(hào)表中遍歷。
那局部變量呢?其實(shí)每個(gè)函數(shù)都有一個(gè)自己的符號(hào)表activity_symptom_table。每個(gè)函數(shù)的符號(hào)表都是相互獨(dú)立的。
在php中,執(zhí)行環(huán)境是在_zend_execute_data中,在執(zhí)行某個(gè)函數(shù)時(shí),全局中的_zend_executor_globals中的activity_symptom_table指向當(dāng)前的_zend_execte_data中的symptom_table,以后所有函數(shù)執(zhí)行過(guò)程中的變量修改都是在新的symptom_table中修改,不會(huì)影響全局的變量,也讀不到全局的變量,但函數(shù)執(zhí)行完成后,php在將原來(lái)的execute_data恢復(fù),恢復(fù)到全局變量,這樣就實(shí)現(xiàn)了全局變量和局部變量的互換。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31882.html
摘要:前言騰訊一面,相比阿里一面來(lái)說(shuō),騰訊一面先給打電話預(yù)定時(shí)間,這也給了我們這些面試者去準(zhǔn)備的時(shí)間。其實(shí)閉包也就是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域的函數(shù)而已。常用的創(chuàng)建閉包的方法就是在函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。 前言 騰訊一面,相比阿里一面來(lái)說(shuō),騰訊一面先給打電話預(yù)定時(shí)間,這也給了我們這些面試者去準(zhǔn)備的時(shí)間。但是也正是因?yàn)檫@種確定性,也有在等待電話的時(shí)候的心情的忐忑。 背景 我是一名大三學(xué)生,大一...
摘要:對(duì)于來(lái)說(shuō),變量有全局變量和局部變量之分那么,他們都是存儲(chǔ)到一個(gè)哈希表內(nèi)了么其實(shí)不是的,變量存儲(chǔ)也有作用域的概念。 上次跟大家講了垃圾回收機(jī)制后,有些小伙伴對(duì)底層原理比較感興趣,私信問(wèn)我了一些關(guān)于變量的相關(guān)知識(shí),既然大家對(duì)變量比較感興趣,那么這次我們來(lái)系統(tǒng)的講一下變量的底層原理 變量結(jié)構(gòu) 首先,我們還是先擺上我們的zval結(jié)構(gòu)體,即php所有變量都會(huì)以zval結(jié)構(gòu)體的形式實(shí)現(xiàn) struc...
摘要:,跨站腳本攻擊。實(shí)際發(fā)的請(qǐng)求就是,用于表示這是一個(gè)請(qǐng)求。,用于告知服務(wù)器根據(jù)這個(gè)參數(shù)獲取回調(diào)函數(shù)的名稱,通常約定就叫。,回調(diào)函數(shù)的名稱,也是前面參數(shù)的值,可省略,會(huì)自動(dòng)生成。 本次課程主要圍繞 PHP 面試和筆試中經(jīng)常會(huì)出現(xiàn)的一些知識(shí)點(diǎn),但是面試官會(huì)在筆試題基礎(chǔ)上深入擴(kuò)展,那么你知道如何更好的回答讓面試官滿意嗎?題目收集自騰訊,迅雷,美圖等公司的筆試面試題,以及本人面試經(jīng)歷中印象中的知...
摘要:進(jìn)擊的巨人第三篇,本篇就作用域作用域鏈閉包等知識(shí)點(diǎn),一一擊破。在此我們遵照的方式,暫且稱是閉包。所以,一名合格的前端,除了會(huì)用閉包,還要正確的解除閉包引用。 進(jìn)擊的巨人第三篇,本篇就作用域、作用域鏈、閉包等知識(shí)點(diǎn),一一擊破。 showImg(https://segmentfault.com/img/bVburWd?w=1280&h=854); 作用域 作用域:負(fù)責(zé)收集并維護(hù)由所有聲明的...
摘要:為請(qǐng)求指定一個(gè)回調(diào)函數(shù)名。這主要用來(lái)讓生成一個(gè)獨(dú)特的函數(shù)名,這樣管理請(qǐng)求更容易,也能方便地提供回調(diào)函數(shù)和錯(cuò)誤處理。在回調(diào)函數(shù)中,通常我們只需通過(guò)判斷請(qǐng)求是否完成,如果已完成,再根據(jù)判斷是否是一個(gè)成功的響應(yīng)。 本篇文章借鑒自 博客園文章 原文地址 AJAX即Asynchronous Javascript And XML(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的...
閱讀 3637·2020-12-03 17:42
閱讀 2798·2019-08-30 15:54
閱讀 2256·2019-08-30 15:44
閱讀 595·2019-08-30 14:08
閱讀 1000·2019-08-30 14:00
閱讀 1130·2019-08-30 13:46
閱讀 2818·2019-08-29 18:33
閱讀 3021·2019-08-29 14:11