ホームページ > バックエンド開発 > PHPチュートリアル > PHP カーネル リサーチの静的変数_PHP チュートリアル

PHP カーネル リサーチの静的変数_PHP チュートリアル

WBOY
リリース: 2016-07-14 10:08:23
オリジナル
1001 人が閲覧しました

静的変数

unset が呼び出されない場合、この静的変数は常に存在し、プログラムが終了するまで Zend メモリ管理によって解放されます。
静的ローカル変数にすることができます: 関数で定義され、関数が実行された後も静的変数は消えません
静的メンバー変数にすることができます: クラスで定義され、すべてのクラスのオブジェクト間で共有できます
例えば
関数テスト(){
静的 $a=1;
$a++
}
test(); //$a=2
test();//$a=3
test();//$a=4
ついに$a=4...
カーネルから解析してみましょう
static は関数ではなくキーワードであるため、LEX 構文分析からのみ見つけることができます
zend/zend_ language_scanner.l を開いて static を見つけます
コードを見つけました
"静的" {
T_STATIC を返す
}
はマクロです
zend/zend_ language_pareser.l を開く
T_STATICを検索
コードを見つけました
T_STATIC static_var_list ';'
static_var_list をフォローしてください
コードを見つけました
static_var_list:
static_var_list ',' T_VARIABLE { zend_do_fetch_static_variable(&$3, NULL, ZEND_FETCH_STATIC TSRMLS_CC) }
️ static_var_list ',' T_VARIABLE '=' static_scalar { zend_do_fetch_static_variable(&$3, &$5, ZEND_FETCH_STATIC TSRMLS_CC) }
|
|
;
以上です。PHP の構文パーサーによって上記のコードに解析されます
zend_do_fetch_static_variable は関数です
zend/zend_compile.cで定義されています
コードは次のとおりです
void zend_do_fetch_static_variable(znode *varname, const znode *static_assignment, int fetch_type TSRMLS_DC)
{
zval *tmp; //一時変数
zend_op *オフライン;
znode lval;
znode の結果;
ALLOC_ZVAL(tmp); // メモリの一部を申請します
if (static_assignment) {
*tmp = static_assignment->u.constant;
} else {
INIT_ZVAL(*tmp);
}
If (!CG(active_op_array)->static_variables) {//静的変数の HASH キー値を初期化します
ALLOC_HASHTABLE(CG(active_op_array)->static_variables);
// HASH値を初期化する
zend_hash_init(CG(active_op_array)->static_variables, 2, NULL, ZVAL_PTR_DTOR, 0);
}
zend_hash_update(CG(active_op_array)->static_variables, varname->u.constant.value.str.val, varname->u.constant.value.str.len+1, &tmp, sizeof(zval *), NULL);
if (varname->op_type == IS_CONST) {
if (Z_TYPE(varname->u.constant) != IS_STRING) {
Convert_to_string(&varname->u.constant);
}
}
opline = get_next_op(CG(active_op_array) TSRMLS_CC); 
opline->result.op_type = IS_VAR; 
opline->result.u.EA.type = 0; 
opline->result.u.var = get_temporary_variable(CG(active_op_array)); 
opline->op1 = *varname; 
SET_UNUSED(opline->op2); 
opline->op2.u.EA.type = ZEND_FETCH_STATIC; 
result = opline->result; 
if (varname->op_type == IS_CONST) {
zval_copy_ctor(&varname->u.constant); 
}
fetch_simple_variable(&lval, varname, 0 TSRMLS_CC); /* デフォルトのフェッチが BP_VAR_W であるという事実に依存します */ www.2cto.com
if (fetch_type == ZEND_FETCH_LEXICAL) {
znode ダミー。 
zend_do_begin_variable_parse(TSRMLS_C); 
zend_do_assign(&dummy, &lval, &result TSRMLS_CC); 
zend_do_free(&dummy TSRMLS_CC); 
} else {
zend_do_assign_ref(NULL, &lval, &result TSRMLS_CC); 
}
CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED; 
/* zval_dtor(&varname->u.constant); */
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477784.html技術記事静态变量它可以静态全局变量、如果不调用解除、那么この静态变量会常在、程序退出時才由Zend内存管理来释放它可以静态局部...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート