PHP ソースコードを読むと、多くのマクロに遭遇します。これらのマクロの意味を理解していないと、コードを理解するのに非常に困難が生じます。ここで、CG と EG という 2 つのマクロの意味を見てみましょう。
CG
意味
CG の意味は、compiler_globals です。 Zend コンパイラ関連のグローバル変数。
関数
PHP コードは最終的に実行のためにオペコードに変換されることは誰もが知っています。 PHP から Opcode への変換中に、一部の情報を保存する必要があります。この情報は CG グローバル変数に保存されます。
Zend が PHP コードを Opcode に変換し、GC グローバル変数を使用してその情報を保存する方法を知りたい場合は、Zend/zend_lang_scanner.c ファイルのcompile_file(zend_file_handle *file_handle, int type) メソッドを参照してください。
コード
Zend の /zend_globals_macros.h ファイルには、このマクロに関連するコードが含まれています。以下の通り:
/* 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
meaning
EG は executor_globals を意味します。 Zend エグゼキュータに関連するグローバル変数。
機能
Zend エンジンがオペコードを実行するとき、実行中のステータスを記録する必要があります。たとえば、現在実行中のクラスのスコープ、現在ロードされているファイルなどです。
コード
このマクロに関連するコードは Zend/zend_globals_macros.h ファイルにあります。以下の通り:
/* 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;
Others
EGとCGは一部のデータを共有しています。たとえば、function_table (ストレージメソッド情報)、class_table (ストレージクラス情報) です。
関連するコードは、次のように Zend/zend_execute_API.c の init_executor メソッドで見つかりました:
void init_executor(void) /* {{{ */ { zend_init_fpu(); ...... EG(function_table) = CG(function_table); EG(class_table) = CG(class_table); ...... }
以上がPHP7ソースコードのCGマクロとEGマクロの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。