php閉包是什麼?有什麼用?下面這篇文章就來跟大家介紹一下php閉包。有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
什麼是php閉包?
PHP閉包實作主要就是靠匿名函數
將匿名函數在普通函數中當數傳入,也可以被傳回.這就實現了—個簡單的閉包。
通俗的說:子函數可以使用父函數中的局部變量,這種行為就叫閉包!
閉包的兩個持點:
1、作為一個函數變數的一個引用-當函數返回時,其處於激活狀態. ?
2、一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區.
其實上面兩點可以合成一點,就是閉包函數返回時,該函數內部變數處於激活狀態,函數所在棧區依然保留。
php閉包有什麼用?
實作php閉包既可以讀取函數內部的變量,同時還可以將變數始終保存在記憶體中,使得即使函數執行完畢,變數也將一直存在。
閉包的幾個作用:
1、減少foreach的循環的程式碼
例如手冊http://php.net/manual/en/functions.anonymous.php 中的範例Cart
<?php // 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。 // 其中有一个方法用来计算购物车中所有商品的总价格。该方法使用了一个closure作为回调函数。 class Cart { constPRICE_BUTTER = 1.00; constPRICE_MILK = 3.00; constPRICE_EGGS = 6.95; protected $products = array(); publicfunction add($product,$quantity) { $this->products[$product] =$quantity; } publicfunction getQuantity($product) { returnisset($this->products[$product]) ?$this->products[$product] : FALSE; } publicfunction getTotal($tax) { $total= 0.00; $callback= function($quantity,$product) use ($tax, &$total) { $pricePerItem= constant(__CLASS__. "::PRICE_" . strtoupper($product)); $total+= ($pricePerItem* $quantity) * ($tax+ 1.0); }; array_walk($this->products,$callback); returnround($total, 2);; } } $my_cart= new Cart; // 往购物车里添加条目 $my_cart->add('butter', 1); $my_cart->add('milk', 3); $my_cart->add('eggs', 6); // 打出出总价格,其中有 5% 的销售税. print $my_cart->getTotal(0.05) . "\n"; // The result is 54.29 ?>
這裡如果我們改造getTotal函數必然要使用到foreach
#2、減少函數的參數
function html ($code , $id="",$class=""){ if ($id !== "") $id= " id = \"$id\"" ; $class = ($class !== "")? " class =\"$class\"":">"; $open = "<$code$id$class"; $close = "</$code>"; return function ($inner= "")use ($open,$close){ return "$open$inner$close";}; }
如果是使用平時的方法,我們會把inner放到html函數參數中,這樣不管是程式碼閱讀還是使用都不如使用閉包
3、解除遞迴函數
<?php $fib= function($n)use(&$fib) { if($n== 0 || $n == 1) return 1; return$fib($n- 1) + $fib($n- 2); }; echo$fib(2) . "\n";// 2 $lie= $fib; $fib= function(){die('error');};//rewrite $fib variable echo$lie(5); // error because $fib is referenced by closure
注意上題中的use使用了&,這裡不使用&會出現錯誤n-1)是找不到function的(前面沒有定義fib的型別)
所以想使用閉包解除循環函數的時候就需要使用
<?php $recursive= function () use (&$recursive){ // The function is now available as $recursive }
這樣的形式
4、關於延遲綁定
如果你需要延遲綁定use裡面的變量,你就需要使用引用,否則在定義的時候就會做一份拷貝放到use中
<?php $result = 0; $one = function() { var_dump($result); }; $two = function() use ($result) { var_dump($result); }; $three = function() use (&$result) { var_dump($result); }; $result++; $one(); // outputs NULL: $result is not in scope $two(); // outputs int(0): $result was copied $three(); // outputs int(1)
使用引用和不使用引用就代表了是呼叫時賦值,還是函數宣告時賦值
更多PHP相關知識,請造訪PHP中文網!
以上是php閉包有什麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

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

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

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

禪工作室 13.0.1
強大的PHP整合開發環境