鍍金池/ 問答/PHP/ php用eval定義static變量疑問

php用eval定義static變量疑問

// 正確方式:
function a(){
    static $c;
    if(empty($c)){
        $c = 'cc';
        echo '<br>init c';
    }
}
a();
a();
// 可以正確的只輸出1次init c

// 錯(cuò)誤方式:
function a(){
    eval('static $c;');
    if(empty($c)){
        $c = 'cc';
        echo '<br>init c';
    }
}
a();
a();
// 會(huì)輸出2次init c

怎樣才能用eval實(shí)現(xiàn)定義static變量呢?因?yàn)橛袀€(gè)地方需要根據(jù)傳參確定static變量名。。

回答
編輯回答
喵小咪

首先我不清楚為什么要用這個(gè)函數(shù),還有你的程序?yàn)槭裁葱枰@個(gè)函數(shù),難道它是不可替代的嗎,而且官方文檔說的很明白,這個(gè)函數(shù)是極其危險(xiǎn)的

clipboard.png

其次,再說說靜態(tài)變量這個(gè)東西,它是存在于函數(shù)作用域內(nèi)的,也就是棧里面,一般的函數(shù)內(nèi)變量在函數(shù)結(jié)束后會(huì)釋放,但是靜態(tài)變量卻不會(huì)。就是說,下次再調(diào)用這個(gè)函數(shù)的時(shí)候,該變量的值會(huì)保留下來,就像你的第一個(gè)函數(shù)。
之后,看你的第二個(gè)函數(shù),eval('static $c;'),我們說到了作用域這個(gè)東西,看看手冊(cè)里怎么說的

clipboard.png

這樣應(yīng)該明白了吧,你第二次調(diào)用這個(gè)函數(shù)的時(shí)候相當(dāng)于這個(gè)靜態(tài)變量又被重新定義了一次

2017年6月1日 05:14