回呼函數
#回呼函數,可以配合匿名函數和變數函數實作更優美、複雜的一種函數結構。
回呼函數,就是在處理一個功能的時候,讓這個功能自訂能力再強一些, 準許呼叫這個函數的時候,還可以傳入一個函數配合、協助進行處理。
<?php function woziji($one, $two, $func) { //规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false if(!is_callable($func)) { return false; } //把$one、$two相加,再把$one和$two传入$func这个函数中处理一次 //$func是一个变量函数,参见变量函数 echo $one + $two + $func($one,$two); } //我们定义几个函数试试 function plusx2($foo ,$bar) { $result = ($foo+$bar)*2; return $result; } function jian($x, $y) { $result = $x - $y; return $result; } //调用一下函数,woziji,向里面传入参数试试 echo woziji(20,10,'plusx2'); // 输出结果为 90 //将plusx2改成jian试试结果 echo woziji(20,10,'jian'); //输出结果为 40 ?>
處理過程是這樣的:
將20賦值給形參$one,10賦值給了$two,而plusx2或jian這兩個變數函數,賦值給了$func
在woziji這個函數中判斷plusx2或jian是否為函數,不是函數就return false 停止執行了
顯示plusx2或者jian是函數。因此$one = 20, $two =10相加了,相加後,$one和$two又帶入了$func($one,$two)中。
帶入至裡面後而$func,是可變的,可以為plusx2或jian。如果為plusx2的話,$one = 20,$two = 10 的這個兩個結果又給了plusx2函數裡面的$foo和$bar
$foo + $bar 乘以2後將結果回傳至woziji這個函數功能體的運算處:$one + $two + $func($one,$two);
這樣主得到了運算結果
現在我們明白了回呼函數:在一個調數裡面,再傳入一個函數名,將函數名加上()括號。識為變數函數,配合執行。
變數函數
可變函數,我們也會稱呼為變數函數
變數函數的用法是這樣的:
<?php function demo() { echo '天王盖地虎'; } function test() { echo '小鸡炖蘑菇'; } $fu = 'demo'; //把$fu变为了demo,把demo后加上了一个括号,就执行函数了 $fu(); // 输出为 天王盖地虎 //把$fu的值改为test字符串再试试? ?>
#匿名函數
有時候某個函數對我們來說只是為了某些臨時的處理,函數沒有復用的必要,取個名字是很麻煩的事情,所以需要匿名函數來處理
匿名函數因為沒有名字,如果要使用它,需要將其返回給一個變數。
匿名函數的第一種用法,直接把賦數賦值給變量,呼叫變數即為呼叫函數。
變數函數式的匿名函數
<?php $greet = function($name) { echo $name.',你好'; }; $greet('明天'); //输出 明天,你好 $greet('PHP'); // 输出 PHP,你好 ?>
回調式的匿名函數
<?php function woziji($one,$two,$func) { //规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false if(!is_callable($func)) { return false; } //把$one、$two相加,再把$one和$two传入$func这个函数中处理一次 //$func是一个变量函数,参见变量函数 echo $one + $two + $func($one,$two); //结果为: 150 } woziji(20,30,function($foo,$bar) { $result = ($foo+$bar)*2; return $result; } ); ?>
內部函數:
內部函數,是指在函數內部又宣告了一個函數。
注意事項:
內部函數名,不能是已存在的函數名
#假設在函數a裡面定義了一個內部函數,不能定用兩次函數a 。
我們下面來看程式碼,你很快就會的學習會:
<?php function foo() { echo '我是函数foo哟,调一下我才会执行定义函数bar的过程<br />'; function bar() { echo '在foo函数内部有个函数叫bar函数<br />'; } } //现在还不能调用bar()函数,因为它还不存在 bar(); foo(); //现在可以调用bar()函数了,因为foo()函数的执行使得bar()函数变为已定义的函数 bar(); //再调一次foo()看看是不是会报错? foo(); ?>
你會發現,在上面foo() 函數內部又定義了一個bar函數,這就是內函數數。
仔細觀察和實驗後會得到如下的結論:
1. foo()呼叫兩次會錯誤
2. 如果不調foo()函數無法執行bar函數,因為bar是在foo的內部