PHP核心中重要的兩個全域性變數

2021-06-26 19:39:38 字數 1113 閱讀 7867

在閱讀php原始碼的時候,會遇到很多諸如:cg(),eg() 這樣的巨集,如果不了解這些巨集的意義,會給理解原始碼造成很大困難。

zend引擎中有兩個重要的全域性變數結構體,就是zend引擎關閉之前都會存在的變數:

typedef struct _zend_compiler_globals zend_compiler_globals;

typedef struct _zend_executor_globals zend_executor_globals;

/* compiler */

#ifdef zts

# define cg(v) tsrmg(compiler_globals_id, zend_compiler_globals *, v)

int zendparse(void *compiler_globals);

#else

# define cg(v) (compiler_globals.v)

extern zend_api struct _zend_compiler_globals compiler_globals;

int zendparse(void);

#endif

/* executor */

#ifdef zts

# define eg(v) tsrmg(executor_globals_id, zend_executor_globals *, v)

#else

# define eg(v) (executor_globals.v)

extern zend_api zend_executor_globals executor_globals;

#endif

cg 的含義就是 compiler_globals ,zend編譯器相關的全域性變數;

eg 的含義就是 executor_globals,zend執行器相關的全域性變數;

這兩個結構都包含了很多元素,對理解php核心有很重要的意義:

struct _zend_compiler_globals ;

struct _zend_executor_globals ;

C 兩個cpp呼叫靜態全域性變數與全域性變數問題

前提概要 兩個cpp檔案想操作同乙個map物件,第乙個cpp中做插入處理,第二個cpp中做查詢處理。使用全域性變數可以實現,這裡記錄一下使用靜態全域性變數時,為什麼會出錯的問題。aaa.h include include include using namespace std void f bbb ...

php核心分析(三) 全域性變數

這裡閱讀的php版本為php 7.1.0 rc3,閱讀 的平台為linux cg是從全域性的compiler global中獲取屬性值,裡面儲存的就是編譯過程使用到的全域性變數。struct zend compiler globals sg是從全域性的sapi global中獲取屬性值 todo 更...

php核心分析(三) 全域性變數

這裡閱讀的php版本為php 7.1.0 rc3,閱讀 的平台為linux cg是從全域性的compiler global中獲取屬性值,裡面儲存的就是編譯過程使用到的全域性變數。struct zend compiler globals sg是從全域性的sapi global中獲取屬性值 todo 更...