PHP 自定義函數(shù)高級用法
回調(diào)函數(shù)
回調(diào)函數(shù),可以配合匿名函數(shù)和變量函數(shù)實(shí)現(xiàn)更加優(yōu)美、復(fù)雜的一種函數(shù)結(jié)構(gòu)。
回調(diào)函數(shù),就是在處理一個功能的時候,讓這個功能自定義能力再強(qiáng)一些, 準(zhǔn)許調(diào)用這個函數(shù)的時候,還可以傳入一個函數(shù)配合、協(xié)助進(jìn)行處理。
<?php function woziji($one, $two, $func) { //規(guī)定:檢查$func是否是函數(shù),如果不是函數(shù)停止執(zhí)行本段代碼,返回false if(!is_callable($func)) { return false; } //把$one、$two相加,再把$one和$two傳入$func這個函數(shù)中處理一次 //$func是一個變量函數(shù),參見變量函數(shù) echo $one + $two + $func($one,$two); } //我們定義幾個函數(shù)試試 function plusx2($foo ,$bar) { $result = ($foo+$bar)*2; return $result; } function jian($x, $y) { $result = $x - $y; return $result; } //調(diào)用一下函數(shù),woziji,向里面?zhèn)魅雲(yún)?shù)試試 echo woziji(20,10,'plusx2'); // 輸出結(jié)果為 90 //將plusx2改成jian試試結(jié)果 echo woziji(20,10,'jian'); //輸出結(jié)果為 40 ?>
處理過程是這樣的:
將20賦值給形參$one,10賦值給了$two,而plusx2或者jian這兩個變量函數(shù),賦值給了$func
在woziji這個函數(shù)中判斷plusx2或者jian是否為函數(shù),不是函數(shù)就return false 停止執(zhí)行了
顯示plusx2或者jian是函數(shù)。因此$one = 20, $two =10相加了,相加后,$one和$two又帶入到了了$func($one,$two)中。
帶入至里面后而$func,是可變的,可以為plusx2或者jian。如果為plusx2的話,$one = 20,$two = 10 的這個兩個結(jié)果又給了plusx2函數(shù)里面的$foo和$bar
$foo + $bar 乘以2后將結(jié)果返回至woziji這個函數(shù)功能體的運(yùn)算處:$one + $two + $func($one,$two);
這樣主得到了運(yùn)算結(jié)果
現(xiàn)在我們明白了回調(diào)函數(shù):在一個調(diào)數(shù)里面,再傳入一個函數(shù)名,將函數(shù)名加上()括號。識為變量函數(shù),配合執(zhí)行。
變量函數(shù)
可變函數(shù),我們也會稱呼為變量函數(shù)
變量函數(shù)的用法是這樣的:
<?php function demo() { echo '天王蓋地虎'; } function test() { echo '小雞燉蘑菇'; } $fu = 'demo'; //把$fu變?yōu)榱薲emo,把demo后加上了一個括號,就執(zhí)行函數(shù)了 $fu(); // 輸出為 天王蓋地虎 //把$fu的值改為test字符串再試試? ?>
? ? ?
匿名函數(shù)
有時候某個函數(shù)對于我們來說僅僅是為了某些臨時的處理,函數(shù)沒有復(fù)用的必要,起個名字是很麻煩的事情,所以需要匿名函數(shù)來處理
匿名函數(shù)因為沒有名字,如果要使用它,需要將其返回給一個變量。
匿名函數(shù)的第一種用法,直接把賦數(shù)賦值給變量,調(diào)用變量即為調(diào)用函數(shù)。
變量函數(shù)式的匿名函數(shù)
<?php $greet = function($name) { echo $name.',你好'; }; $greet('明天'); //輸出 明天,你好 $greet('PHP'); // 輸出 PHP,你好 ?>
回調(diào)式的匿名函數(shù)
<?php function woziji($one,$two,$func) { //規(guī)定:檢查$func是否是函數(shù),如果不是函數(shù)停止執(zhí)行本段代碼,返回false if(!is_callable($func)) { return false; } //把$one、$two相加,再把$one和$two傳入$func這個函數(shù)中處理一次 //$func是一個變量函數(shù),參見變量函數(shù) echo $one + $two + $func($one,$two); //結(jié)果為: 150 } woziji(20,30,function($foo,$bar) { $result = ($foo+$bar)*2; return $result; } ); ?>
內(nèi)部函數(shù):
內(nèi)部函數(shù),是指在函數(shù)內(nèi)部又聲明了一個函數(shù)。
注意事項:
內(nèi)部函數(shù)名,不能是已存在的函數(shù)名
假設(shè)在函數(shù)a里面定義了一個內(nèi)部函數(shù),不能定用兩次函數(shù)a。
我們下面來看代碼,你將很快的學(xué)習(xí)會:
<?php function foo() { echo '我是函數(shù)foo喲,調(diào)一下我才會執(zhí)行定義函數(shù)bar的過程<br />'; function bar() { echo '在foo函數(shù)內(nèi)部有個函數(shù)叫bar函數(shù)<br />'; } } //現(xiàn)在還不能調(diào)用bar()函數(shù),因為它還不存在 bar(); foo(); //現(xiàn)在可以調(diào)用bar()函數(shù)了,因為foo()函數(shù)的執(zhí)行使得bar()函數(shù)變?yōu)橐讯x的函數(shù) bar(); //再調(diào)一次foo()看看是不是會報錯? foo(); ?>
你會發(fā)現(xiàn),在上面foo() 函數(shù)內(nèi)部又定義了一個bar函數(shù),這就是內(nèi)函數(shù)數(shù)。
仔細(xì)觀察和實(shí)驗后會得出如下的結(jié)論:
1. foo()調(diào)用兩次會報錯
2. 如果不調(diào)foo()函數(shù)無法執(zhí)行bar函數(shù),因為bar是在foo的內(nèi)部