PHPクロージャの用途は何ですか?

青灯夜游
リリース: 2023-02-26 08:18:01
オリジナル
3364 人が閲覧しました

phpクロージャとは何ですか?用途は何ですか?次の記事では、php クロージャについて紹介します。一定の参考値があるので、困っている友人は参考にしていただければ幸いです。

PHPクロージャの用途は何ですか?

php クロージャとは何ですか?

PHP クロージャの実装は主に匿名関数に依存します

匿名関数は通常の関数に数値として渡され、返すこともできます。これにより、シンプルなクロージャが実現されます。 。

わかりやすく言うと、子関数は親関数のローカル変数を使用できます。この動作はクロージャと呼ばれます。

クロージャの 2 つの保持点:

1. 関数変数への参照として - 関数が戻ると、関数はアクティブになります。 ?

2. クロージャは関数が戻ったときにリソースを解放しないスタック領域。

実際には、上記の 2 つの点を 1 つの点にまとめることができます。つまり、クロージャー関数が戻ったときに、関数の内部変数がアクティブ化されます。および関数が配置されているスタック領域は保持されます。

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、Reduce を使用する必要があります。関数パラメータ

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";};
 
}
ログイン後にコピー

通常の方法を使用する場合は、HTML 関数のパラメータに inner を入れます。そのため、コードの読み取りでも使用でも、クロージャを使用する方が良いです

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 では & が使用されていることに注意してください。ここで & が使用されていない場合、エラーが発生し、関数は実行できません。 (fib は以前に定義されていませんでした) Type)

したがって、ループ関数をキャンセルするためにクロージャーを使用したい場合は、

<?php
$recursive= function () use (&$recursive){
// The function is now available as $recursive
}
ログイン後にコピー

# のような形式を使用する必要があります。

#4. 遅延バインディングについて

使用中の変数のバインドを遅らせる必要がある場合は、参照を使用する必要があります。そうしないと、

の定義時にコピーが作成されて使用されます。

<?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 中国語 Web サイトを参照してください。 !

以上がPHPクロージャの用途は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート