所謂
回呼函數,就是指調用函數時並不是傳遞一個標準的變數作為參數,而是將另一個函數作為參數傳遞到調用的函數中。如果在函數的格式說明中出現
callback 類型的參數,則該函數就是回呼函數。上一節介紹了php可變參數的函數,這一節就進入php回呼函數的學習。
回呼函數的格式說明如下的所示:
mixed funName (callback arg) //在參數列表中使用偽類型 callback 描述
callback 也屬於 PHP 中偽類型的一種,說明函數的參數需要接受另一個函數作為實參。一個很重要的問題是為什麼要使用函數作為參數呢?前面介紹過了,通過參數的傳遞可以改變調用函數的執行行為,但有時僅將一個值傳遞給函數能力還是有限的。如果可以將一個使用者自訂的執行過程傳遞到函數中使用,就大大增加了使用者對函數功能的擴充。而如何聲明和使用回呼函數也是比較關鍵的問題,如果需要聲明回呼函數,就需要先瞭解一下變數函數。
變數函數
變數函數也稱為可變函數。如果一個變數名後面有圓括弧, PHP將尋找與變數的值同名的函數,並且將嘗試執行它。例如,聲明一個函數 test(),將函數名稱字串 test 賦值給變數 $demo。如果直接列印 $demo 變數,輸出的值一定是字串 test;但是如果在 $demo 變數後面加上圓括弧 $demo(),則為調用對應 $demo 變數值 test 的函數。這樣就可以將不同的函數名稱賦給同一個變數,再通過變數去調用這個函數,類似於物件導向中多態特性的應用。
其執行個體代碼如下所示:
<?php function one($a,$b){ return $a + $b; } function two($a,$b){ return $a*$b; } function three($a,$b){ return $a/$b; } $result = "one"; //將函數名one賦值給變數$result,執行$result()時則調用函數one() //$result = "two"; //將函數名two賦值給變數$result,執行$result()時則調用函數two() //$result = "three"; //將函數名three賦值給變數$result,執行$result()時則調用函數three() echo "結果是:".$result(4,6); //變數$result接收到哪個函數名的值,就調用哪個函數?>
在上面的執行個體中聲明了 one()、two()和three()三個函數,分別用於計算兩個數的和、乘積和商。並將三個函數的函數名(不帶圓括弧)以字串的方式賦給變數 $result,然後使用變數名 $result 後面加上圓括弧並傳入兩個整型參數,就會尋找與變數 $result 的值同名的函數執行。大多數函數都可以將函數名賦值給變數,形成變數函數。但變數函數不能用於語言結構。
使用變數函式宣告和應用回呼函數
如果要自訂一個可以回調的函數,可以選擇使用變數函數協助實現。在定義回呼函數時,函數的聲明結構是沒有變化的,只要聲明的參數是一個普通的變數即可。但在函數的內部應用這個參數變數時,如果加上圓括弧就可以調用到和這個參數值同名的函數了,所以為其傳遞的參數一定要是另一個函數的名稱字串才行。使用回呼函數的目的是可以將一段自己定義的功能傳到函數內部使用。
其代碼執行個體如下所示:
<?php //聲明回呼函數filter, 在0-10的整數中通過自訂條件過濾不要的數字 function filter($fun){ for($i=0; $i<=10; $i++){ //將參數變數$fun加上一個圓括弧$fun(),則為調用和變數$fun值同名的函數 if($fun($i)) continue; echo $i.'<br>'; } } //聲明一個函數one,如果參數是3的倍數就返回ture,否則返回false function one($num){ return $num%3 == 0; } //聲明一個函數two,如果參數是一個迴文數返回ture,否則返回false function two($num){ return $num == strrev($num); } filter("one"); //列印出10以內非3的倍數,參數one是函數one()的名稱字串,是一個回調 echo "---------------------<br>"; filter("two"); //列印出10以內非迴文數,參數two是函數two()的名稱字串,是一個回調?>
啟動並執行結果為:
在上面的執行個體中,如果聲明的函數 filter()只是接受普通的值作為參數,則使用者能過濾掉的數字就會比較單一。而本例中在定義的函數 filter()中調用到了通過參數傳遞進來的一個含稅作為過濾條件,這樣函數的功能就強大多了,可以在 filter() 函數中過濾掉你不喜歡的任一數字。在函數 filter()內部通過參數變數 $fun 加上一個圓括弧 $fun(),就可以調用和變數 $fun 值相同的函數作為過濾的條件。例如,本執行個體中聲明了 one() 和 two() 兩個函數,分別用於過濾掉 10 之內 3 的倍數和迴文數時,只要在調用 filter() 時將函數名稱 one 和 two 字串傳遞給參數,即將這兩個函數傳遞給 filter() 函數內部使用。
這一章講解了php回呼函數的變數函數定義、聲明和應用,下一章我們將介紹php回呼函數的call_user_func_array()函數及其用法。
【相關教程推薦】
1. 《php.cn獨孤九賤(4)-php視頻教程》
2. php編程從入門到精通全套視頻教程
3. php實戰視頻教程