原創 PHP核心研究 靜態變數

2021-06-04 18:43:11 字數 2274 閱讀 8688

宣告:本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。

php技術部落格 在csdn也會同步更新的哦.

靜態變數

它可以是 靜態全域性變數,如果不呼叫unset,那麼這個靜態變數會一直存在,直到程式退出時才由zend記憶體管理來釋放

它可以是 靜態區域性變數:在函式裡定義,函式執行完後,該靜態變數不會消失

它可以是 靜態成員變數:在類裡定義,它可以在所有類的物件中共享

例如

[php]

<?php

function test()

test(); //$a=2

test();//$a=3

test();//$a=4

[/php]

最後 $a=4了..

下面我們從核心裡面分析它

static不是乙個函式 ,它是乙個關鍵字 ,所以只能從lex語法分析中來查詢

開啟 zend/zend_language_scanner.l 查詢 static

找到**

[c]

"static"

[/c]

是乙個巨集

再開啟 zend/zend_language_pareser.l

搜 t_static

找到**

[c]

t_static static_var_list ';'

[/c]

跟進 static_var_list

找到**

[c]

static_var_list:

static_var_list ',' t_variable

| static_var_list ',' t_variable '=' static_scalar

| t_variable

| t_variable '=' static_scalar

;[/c]

就是這裡了..它由php的語法分析程式 解析成上面的**

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 分析了一下,原因在於每...