回呼函數、閉包在JS中並不陌生,JS使用它可以完成事件機制,進行許多複雜的操作。 PHP中卻不常使用,今天來說一說PHP中的回呼函數和匿名函數。
回呼函數 Callback (即call then back 被主函數呼叫運算後會返回主函數),是指透過函數參數傳遞到其它程式碼的,某一塊可執行程式碼的引用。
通俗的解釋就是把函數作為參數傳入進另一個函數中使用;PHP中有許多「需求參數為函數」的函數,像array_map,usort,call_user_func_array之類,他們執行傳入的函數,然後直接將結果傳回主函數。好處是函數作為值使用起來方便,而且程式碼簡潔,可讀性強。
匿名函數,顧名思義,是沒有一個確定函數名的函數,PHP將匿名函數和閉包視為相同的概念(匿名函數在PHP中也叫作閉包函數)。它的用法,當然只能被當作變數來使用了。
PHP中將一個函數賦值給一個變數的方式有四種:
我們經常會用到的:函數在外部定義/或PHP內置,直接將函數名稱作為字串參數傳入。注意:如果是類別靜態函數的話以CLASS::FUNC_NAME的方式傳入。
使用create_function($args, $func_code);建立函數,會傳回一個函數名稱。 $func_code為代碼體,$args為參數字串,以','分隔;
直接賦值:$func_name = function($arg){statement};
直接使用匿名函數,在參數處直接定義函數,不賦給具體的變數值;
第一種方式因為是平常所用,不再多提;第二種類似eval()方法的用法,也被PHP官方列為不建議使用的方式,而且其定義方式太不直觀,我除了測試外,也沒有在其他地方使用過,也略過不提。這裡重點說一下第三種和第四種用法;
後兩種創建的函數就被稱為匿名函數,也就是閉包函數, 第三種賦值法方式創建的函數非常靈活,可以透過變數引用。可以用is_callable($func_name) 來測試此函數是否可以被調用, 也可以透過$func_name($var)來直接調用;而第四種方式創建的函數比較類似於JS中的回調函數,不需要變量賦值,直接使用;
另外要特別介紹的是use 關鍵字,它可以在定義函數時,用來引用父作用域中的變數;用法為function($arg) use($outside_arg) { function_statement} 。其中$outside_arg 為父作用域中的變量,可以在function_statement使用。
這種用法用在回呼函數「參數值數量確定」的函數中。 如usort需求$callback的參數值為兩項,可是我們需要引入別的參數來影響排序怎麼辦呢?使用use()關鍵字就很方便地把一個新的變數引入$callback內部使用了。
array_map/array_filter/array_walk:
#把這三個函數放在一塊是因為這三個函數在執行邏輯上比較類似,類似下面的程式碼:
$result = []; foreach($vars as $key=>$val){ $item = callback(); $result[] = $item; } return $result;
其callback應如下:
$callback = function(&$val, $key[, $arg]){ doSomething($val); }
array_walk回傳執行是否成功,是一個布林值。對$value新增引用符號可以在函數內改變$value值,以達到改變$vars數組的效果。由於其$callback對參數數量要求為兩項,array_walk不能傳入strtolower/array_filter之類的$callback,若想實現類似功能,可以使用接下來要說的array_map()。
array_walk_recursive($arr, $callback);
傳回值和執行機制類似array_walk;
其callback同array_walk,不同的是,如果$val是數組,函數會遞歸地向下處理$val;需要注意的是這樣的話$val為數組的$key就會被忽略掉了。
array_filter($vars, $callback, $flag);
其$callback類似於:
$callback = function($var){ return true or false; }
array_filter會過濾掉$callback執行時傳回為false的項目,array_filter傳回過濾完成後的陣列。
第三個參數 $flag決定其callback形參$var的值,不過這個可能是PHP高版本的特性,我的PHP5.5.3不支持,大家可以自行測試。預設傳入數組每個項目的value,當flag為ARRAY_FILTER_USE_KEY傳入數組每個項目的key,ARRAY_FILTER_USE_BOTH傳入鍵和值;
array_map($callback, &$var_as [,$var_bs...] );
其$callback類似:
$callback = function($var_a[, $var_b...]){ doSomething($var_a, $var_b); }
傳回$var_as經過callback處理後的陣列(會改變原數組);如果有多個數組的時候將兩個數組同樣順序的項目傳入處理,執行次數為參數數組中項目最多的個數;
usort/array_reduce
把这两个函数放在一块,因为他们的执行机制都有些特殊。
usort(&$vars, $callback)
$callback应该如下:
callback = function($left, $right){ $res = compare($left, $right); return $res; }
usort返回执行成功与否,bool值。用户自定义方法 比较$left 和 $right,其中$left和$right是$vars中的任意两项;
$left > $right时返回 正整数, $left
$vars中的元素会被取出会被由小到大升序排序。 想实现降序排列,将$callback的返回值反一下就行了。
array_reduce($vars ,$callable [, mixed $initial = NULL])
$callback应该如下:
$callback = function($initial, $var){ $initial = calculate($initail, $var); return $initial; }
初始值$initial默认为null,返回经过迭代后的initial;一定要将$initial返回,这样才能不停地改变$initial的值,实现迭代的效果。
这里顺便说一下map和reduce的不同:
map:将数组中的成员遍历处理,每次返回处理后的一个值,最后结果值为所有处理后值组成的多项数组;
reduce:遍历数组成员,每次使用数组成员结合初始值处理,并将初始值返回,即使用上一次执行的结果,配合下一次的输入继续产生结果,结果值为一项;
call_user_func/call_user_func_array
call_user_func[_array]($callback, $param)
$callback形如:
$callback = function($param){ $result = statement(); return $result; }
返回值多种,具体看$callback。
以上是php回呼函數與匿名函數用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

Fibers在PHP8.1中引入,提升了並發處理能力。 1)Fibers是一種輕量級的並發模型,類似於協程。 2)它們允許開發者手動控制任務的執行流,適合處理I/O密集型任務。 3)使用Fibers可以編寫更高效、響應性更強的代碼。

PHP社區提供了豐富的資源和支持,幫助開發者成長。 1)資源包括官方文檔、教程、博客和開源項目如Laravel和Symfony。 2)支持可以通過StackOverflow、Reddit和Slack頻道獲得。 3)開發動態可以通過關注RFC了解。 4)融入社區可以通過積極參與、貢獻代碼和學習分享來實現。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具