+----phpstar-------------------------------------++---為大家提供最全 最好的php學習筆記 --++---- 看筆記就可以學好php--------------------++-----------------------------------------------------+ 可變函數類似可變變數,在函數上 函數的名稱也是可變的。意味著 一個函數的函數名也是可以用一個變數代替的。 利用可變變數 完成計算機 匿名函數:匿名函數,指的是沒有函數名稱的函數。因此這個函數就沒有辦法像一個正常函數一樣被調用。通常 都是作為某個函數的參數來使用,這讓自動地調用。Callback 資料偽類型。例如:map數組的操作: 我們沒有辦法直接調用這個匿名函數,因此總是會作為某個函數的參數來使用。匿名函數的作用:普通函數可以先使用,後定義。因為函數的聲明不是在指令碼的執行期間確定的,而是在指令碼的編譯期間確定的。而 編譯 在 執行之前。 於此相對,匿名函數是在執行時才確定的。而且 普通函數 一旦聲明 在指令碼結束之前都可以調用。於此相對,匿名函數在執行完畢後,函數空間立即釋放。匿名函數只能去執行一次。如果一個函數只用一次的話,匿名函數會比較節省資源。但是匿名函數是php的性特徵。Php5.3才會有的匿名函數。 如果沒有匿名函數,那麼哪些需要以callback形式做參數的調用應該如何處理?callback參數應該使用函數名代替,同時需要有相對應的函數存在。 Tip:php的匿名函數 也叫 閉包函數。 函數的遞迴調用:函數可以在任何地方調用,甚至包括在函數的函數體內,對當前函數進行調用。如果是函數對自己進行調用,稱之為函數的遞迴調用。最極端的例子: 函數的遞迴調用,可以解決 顯示生活中一些 可以按照遞迴思想去思考的問題。求階乘5! = 5 * 4 * 3 * 2 * 1;4! = 4 * 3 * 2 * 13! = 3 * 2 * 1;1! = 1;5! = 5 * 4!;4! = 4 * 3!; 假設我們現在定義了一個函數可以求n的階乘。 Jiecheng(n); 返回n的階乘 n * jiecheng(n-1) Jiecheng(5) = 5 * jiecheng(4); 如果需要使用遞迴的思想完成編程設計的話,大家需要考慮2個主要問題?1 遞迴點?這個問題為什麼可以使用遞迴完成。2 遞迴出口?如果函數內不加限制的調用自己的話,一定會無限制的執行下去(死)。一定要找到,當達到什麼條件後,遞迴調用就可以終止了。 這個條件就是遞迴點。 例如階乘:遞迴點:jiecheng(n) = n * jiecheng(n-1)。 求n的階乘 與 n-1的階乘的解決方案是一樣的,因此可以用一個函數完成。出口:當需要求得1的階乘時,不用再繼續調用自己求得,因為1的階乘是可以知道的。每當調用一個函數 會在 函數的棧區 形成一個函數的執行空間:棧:記憶體的一個儲存地區。他的操作特點:後進先出(先進後出)注意:遞迴調用的函數,每一個都會開闢一個記憶體空間,意味著 麼一個調用都有一個單獨的範圍,因此 局部變數是不會共用的。 通常使用 static 靜態局部變數解決問題。 斐波那契數列:前兩項已知(通常是1, 1),從第三項開始,每一項都是前兩項之和:1 1 2 3 5 8 13 編寫一個函數,求出斐波那契數列地n項的值Fbnq(4) == 3Fbnq(7) == 13Fbnq(n) = fbnq(n-1) + fbnq(n-2);遞迴點:遞迴出口:前兩項已知 函數的一些相關資訊的 系統函數。Function_exists(‘函數名’); 判斷一個函數是否被定義,是否已經存在。傳回值為布爾類型 Func_get_args(); 獲得當前函數的所有參數的值。應該在函數內調用,獲得的是函數調用時傳遞進來的參數,而不是函數定義時的形參。注意:函數在調用時,實際參數的個數應該大於等於形式參數的個數。只能多 不能少!當 實際參數的個數 多餘 形式參數的個數時 我們怎麼在函數中獲得實際參數的值?可以使用函數內的 func_get_args()函數獲得所有的實際參數。實際參數按照傳遞的位置,依次儲存在func_get_args()的返回結果中。 例如:製作一個函數,求得所有參數的和。要求是參數個數不固定。sumAll(); 0sumAll(10); 10sumAll(10, 20); 30sumAll(10, 20, 30) 60 程式如下:Func_get_arg(int index) 獲得某個參數的函數。參數int 表示的第幾個。索引位置從0開始。 Func_num_args 獲得所以的實際參數的個數。 函數中 可以使用 魔術常量 __FUNCTION__來代替當前的函數名。常見的用法,在遞迴中 使用這個值:可以保證在函數名發生變化時,不需要修改函數體,就可以完成操作。