php閉包有什麼用?

青灯夜游
發布: 2023-02-26 08:18:01
原創
3363 人瀏覽過

php閉包是什麼?有什麼用?下面這篇文章就來跟大家介紹一下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(&#39;butter&#39;, 1);
$my_cart->add(&#39;milk&#39;, 3);
$my_cart->add(&#39;eggs&#39;, 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(&#39;error&#39;);};//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.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板