宣告:本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。
php技術部落格 在csdn也會同步更新的哦.
靜態變數
它可以是 靜態全域性變數,如果不呼叫unset,那麼這個靜態變數會一直存在,直到程式退出時才由zend記憶體管理來釋放
它可以是 靜態區域性變數:在函式裡定義,函式執行完後,該靜態變數不會消失
它可以是 靜態成員變數:在類裡定義,它可以在所有類的物件中共享
例如
[php]最後 $a=4了..<?php
function test()
test(); //$a=2
test();//$a=3
test();//$a=4
[/php]
下面我們從核心裡面分析它
static不是乙個函式 ,它是乙個關鍵字 ,所以只能從lex語法分析中來查詢
開啟 zend/zend_language_scanner.l 查詢 static
找到**
[c]是乙個巨集"static"
[/c]
再開啟 zend/zend_language_pareser.l
搜 t_static
找到**
[c]跟進 static_var_listt_static static_var_list ';'
[/c]
找到**
[c]就是這裡了..它由php的語法分析程式 解析成上面的**static_var_list:
static_var_list ',' t_variable
| static_var_list ',' t_variable '=' static_scalar
| t_variable
| t_variable '=' static_scalar
;[/c]
zend_do_fetch_static_variable 這個函式就是了
它在zend/zend_compile.c裡定義
**如下
[c]void zend_do_fetch_static_variable(znode *varname, const znode *static_assignment, int fetch_type tsrmls_dc)
else
if (!cg(active_op_array)->static_variables)
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)
}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)
fetch_******_variable(&lval, varname, 0 tsrmls_cc); /* relies on the fact that the default fetch is bp_var_w */
if (fetch_type == zend_fetch_lexical) else
cg(active_op_array)->opcodes[cg(active_op_array)->last-1].result.u.ea.type |= ext_type_unused;
/* zval_dtor(&varname->u.constant); */
}[/c]
php靜態變數
在函式執行完後,變數值仍然儲存,並沒有變回初始設定的值0。function test test test test 結果 1 23可以發現a設定靜態變數之後,每次 a的值都儲存下來了。我剛開始還以為這個變數變成了全域性變數,測試發現這個變數 a依然只能在函式裡呼叫,在函式外是不能呼叫的。我們再來看看...
php 靜態變數static
靜態變數只存在於函式作用域內,也就是說,靜態變數只存活在棧中。一般的函式內變數在函式結束後會釋放,比如區域性變數,但是靜態變數卻不會。就是說,下次再呼叫這個函式的時候,該變數的值會保留下來。只要在變數前加上關鍵字static,該變數就成為靜態變數了。functiontest 第一次執行,nm tes...
C 靜態變數與靜態方法例項研究
程式如下 複製 如下 public static string 英漢 string english,翻譯結果 乙個或多個 else 可以翻譯 else if 乙個或多個 翻譯結果.乙個 throw new exception 引數錯誤 else catch exception 分析了一下,原因在於每...