1) ローカル変数を作成します: PHP 言語層では、変数がグローバルで宣言されていない限り、それらはローカル変数です。拡張機能を記述する場合、PHP スクリプトからアクセスできるローカル変数を作成するには、まず zval コンテナを作成し、次に必要に応じて zval ウィンドウに情報を入力し、最後にそれを Zend エンジンの内部シンボル テーブルに導入します。以下の通り:
zval *new_var;
//新しい zval コンテナを適用して初期化する
MAKE_STD_ZVAL(new_var);
// 現在アクティブなシンボル テーブルに "new_var" 変数を導入する
ZEND_SET_SYMBOL(EG(active_symbol_table) ) ,"new_var",new_var);
//これで、$new_var を使用してスクリプト内でこの変数にアクセスできるようになります
MAKE_STD_ZVAL() マクロは、ALLOC_ZVAL() マクロを通じて新しい zval コンテナーのメモリ空間に適用されますINIT_PVAL() マクロを呼び出して zval コンテナを初期化します。 MAKE_STD_ZVAL マクロ コードは次のとおりです。マクロは、zval コンテナーの参照カウンター (refcount) を 1 に設定し、その後参照フラグを 0 に設定する役割を果たします。 INIT_PVAL() マクロ コードは次のとおりです:
#define INIT_PZVAL(z)
(z)->refcount = 1;
(z)-> is_ref = 0;
zval コンテナを作成した後、それを PHP スクリプトで使用する前にシンボル テーブルに導入する必要があります。 ZEND_SET_SYMBOL() マクロは、新しく作成された変数を Zend エンジン内のシンボル テーブルに導入する役割を果たします。このマクロは、まず変数がシンボル テーブルに既に存在するかどうかを確認し、存在する場合は別の参照変数に置き換えられ、元の zval コンテナが自動的に破棄されます。
ZEND_SET_SYMBOL() マクロは、EG マクロを通じて Zend エグゼキューターのグローバル構造 (Zend エグゼキューターがオペコードを実行する部分) にアクセスします。EG (active_symbol_table) を使用している場合は、現在のアクティブなシンボル テーブル (通常はローカル変数) にアクセスできます。 table) を使用して、いくつかのローカル変数を処理できるようにします。
プログラムの実行効率を非常に重視し、メモリのことはあまり気にしない場合は、zend_hash_update() 関数を使用して変数名がシンボル テーブルに存在するかどうかを確認し、その変数名をシンボル テーブルに強制的に挿入できます。コードは次のとおりです:
zval * new_var;
MAKE_STD_ZVAL(new_var);
zend_hash_update(
EG(active_symbol_table),
"new_var",
sizeof("new_var"),
&new_var,
size of(zval *),
NULL
);
2) グローバル変数を作成します: