php函式的巢狀之謎

2021-08-05 22:41:39 字數 1286 閱讀 9077

/*一定要小心變數作用域*/

functioninsert_dynamic()    }

/* 現在還不能呼叫bar()函式,因為它還不存在 */

insert_dynamic();

/* 現在可以呼叫bar()函式了,因為insert_dynamic()函式

的執行使得bar()函式變為已定義的函式 */

bar(); 

全域性和區域性要搞清。擴充套件

函式巢狀,這個名字有點糾結,也許不太好理解。乙個比較常見的函式巢狀特例:遞迴函式,即函式自己巢狀自己。 一直以為在php中不能有太多的函式巢狀,這是因為在以前某些時候不小心用到了遞迴,在遞迴的深度達到100時, 即函式巢狀的層數達到100時,程式會報乙個 fatal error。如下示例: 

function rt()  

rt();

die();

在我的win7 + php5.3的環境下報錯如下: fatal error:maximum function nesting level of 『100′ reached, aborting!
xg(level)++; 

if (xg(level) == xg(max_nesting_level))

這表示什麼?之前的函式巢狀的層數限制是xdebug擴充套件加上的,為什麼會有這個限制了呢?在xdebug中,xdebug中會記錄每次函式呼叫, 包括巢狀的函式呼叫,函式呼叫中的記憶體,時間等值,這些值在分析程式效能時有大用。如果沒有這個限制,當巢狀的層數太多,機器會記憶體耗盡。 如果這是一台生產環境的伺服器,那麼就會有部分服務不可用,當然生產環境下是不會新增這個擴充套件的。但是在多人共用的開發伺服器上就可能有這個擴充套件, 如果因為乙個開發人員的程式錯誤導致機器不可用,從而使所有的開發人員不能工作,我想這也許是新增限制的原因吧。 

如果我們需要把這個限制的層數加大,怎麼辦呢?改原始碼,重新編譯xdebug擴充套件?不需要,在xdebug的配置項中有一項叫做xdebug.max_nesting_level, 預設情況下,在php.ini中這個配置項是被注釋了的,去掉注釋,將這個值成你所需要的值,200?不夠,那500吧,但是這個值還是不要太大, 如果遞迴太多,對程式的效能有很大的影響,此時,以棧的形式實現遞迴或者用迴圈替換遞迴會是乙個更好的方案, 如:斐波那契數列(fibonacci)的實現,用迴圈來實現會更快。 

結論:php本身的函式巢狀是沒有限制的,如果說有限制,也是記憶體的限制。這是因為php的函式巢狀是以棧的形式實現的。對於每個函式都會分配一段記憶體來儲存函式區域性的內容。

PHP函式的巢狀呼叫

一 php xmlns php function example price tax total price price tax echo 是 total 美元 echo 是 examples total 元 example 15.00 0.75 二 執行結果 是 26.25 美元 是 196.87...

PHP中的函式巢狀層數限制分析

函式巢狀,這個名字有點糾結,也許不太好理解。乙個比較常見的函式巢狀特例 遞迴函式,即函式自己巢狀自己。一直以為在php中不能有太多的函式巢狀,這是因為在以前某些時候不小心用到了遞迴,在遞迴的深度達到100時,即函式巢狀的層數達到100時,程式會報乙個 fatal error。如下示例 複製 如下 f...

函式的巢狀

例1 def index print from index def func index print from func func 定義乙個index函式 定義乙個func函式 呼叫func函式,然後跳轉到那邊執行語句,先執行index 語句,列印from index,然後往下執行,列印from f...