🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
在阅读PHP源码的时候,会遇到很多宏。如果不了解这些宏的含义,对代码理解会带来很多困扰。现在我们就一起来看看CG和EG两个宏的含义。 ## CG ### 含义 CG的含义是 `compiler_globals`。Zend编译器相关的全局变量。 ### 作用 大家都知道PHP代码最终是转化为Opcode去执行的。在PHP转换为Opcode过程中需要保存一些信息。这些信息就保存在CG全局变量中。 如果想了解Zend是如何把PHP代码转换为Opcode,使用GC全局变量保存了那些信息,可以查看 [Zend/zend_language_scanner.c ](https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.c)文件的 `compile_file(zend_file_handle *file_handle, int type)`方法 ### 代码 在 [Zend/zend_globals_macros.h ](https://github.com/php/php-src/blob/master/Zend/zend_globals_macros.h)文件中有这个宏的相关代码。如下: ```c /* Compiler */ #ifdef ZTS <h1>define CG(v) ZEND_TSRMG(compiler_globals_id, zend_compiler_globals *, v)</h1> #else <h1>define CG(v) (compiler_globals.v)</h1> extern ZEND_API struct _zend_compiler_globals compiler_globals; #endif ``` ## EG ### 含义 EG的含义是 `executor_globals`。Zend执行器相关的全局变量。 ### 作用 Zend引擎在执行Opcode的时候,需要记录一些执行过程中的状态。如,当前执行的类作用域,当前已经加载了那些文件,等。 ### 代码 在 [Zend/zend_globals_macros.h](https://github.com/php/php-src/blob/master/Zend/zend_globals_macros.h) 文件中有这个宏的相关代码。如下: ```c /* Executor */ #ifdef ZTS <h1>define EG(v) ZEND_TSRMG(executor_globals_id, zend_executor_globals *, v)</h1> #else <h1>define EG(v) (executor_globals.v)</h1> extern ZEND_API zend_executor_globals executor_globals; #endif ``` ### 其他 EG和CG有一些数据是共用的。如,`function_table` (存储方法信息) ,`class_table` (存储类信息) 。 相关代码在[Zend/zend_execute_API.c](https://github.com/php/php-src/blob/master/Zend/zend_execute_API.c)的`init_executor`方法中发现如下代码: ```c void init_executor(void) /* {{{ */ { zend_init_fpu(); ...... EG(function_table) = CG(function_table); EG(class_table) = CG(class_table); ...... } ```