ホームページ  >  記事  >  バックエンド開発  >  PHPのクロージャ(Closure)無名関数の詳しい解説、クロージャ関数の詳しい解説_PHPチュートリアル

PHPのクロージャ(Closure)無名関数の詳しい解説、クロージャ関数の詳しい解説_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:06:27753ブラウズ

PHPのクロージャ(Closure)匿名関数詳細解説、クロージャ関数詳細解説

PHPのクロージャ(Closure)はPHP5.3で導入された匿名関数です。

クロージャの構文は非常に単純です。注意する必要があるのは use だけで、クロージャと外部変数を接続します。

コードをコピーします コードは次のとおりです:

$a = function() use($b) {}

簡単な例は次のとおりです:

コードをコピーします コードは次のとおりです:

関数コールバック($fun) {
$fun();
}
$msg = "皆さん、こんにちは";
$fun = function () use($msg) {
print "これはクロージャを使用する文字列値です。msg は $msg.
/n";
};
$msg = "皆さん、こんにちは";
コールバック($fun);

結果は次のようになります。これはクロージャを使用する文字列値です。メッセージは次のとおりです。皆さん、こんにちは。

PHP の新しいオープン クロージャ構文では、クロージャの外側で定義された変数を使用するために use を使用します。ここでは外部変数 $msg を使用します。定義後、その値はクロージャの実行後に変更され、元の値が出力されます。値によって渡される基本型パラメータの場合、クロージャの作成時にクロージャの使用値が決定されます。

小規模なアプリケーションは次のとおりです:

コードをコピーします コードは次のとおりです:
/**
* クロージャを使用したカウンタジェネレータ
* これは実際に Python でクロージャを導入する例に基づいています...
*次のように考えることができます:
* 1. counter 関数が呼び出されるたびに、ローカル変数 $counter が作成され、1 に初期化されます。
* 2. 次に、ローカル変数 $counter への参照を生成するクロージャーを作成します。 * 3. 関数 counter は作成したクロージャを返し、ローカル変数を破棄しますが、このときクロージャから $counter への参照があり、
* リサイクルされないため、関数カウンターによって返されるクロージャーはフリー状態を保持していることがわかります
* 変数です。 * 4. counter への各呼び出しは独立した $counter とクロージャを作成するため、返されるクロージャは互いに独立しています
。 * 5. 返されたクロージャを実行し、それが保持する自由状態変数をインクリメントして返します。結果はカウンタです
。 * 結論: この関数は独立したカウンターを生成するために使用できます
​*/
関数カウンター() {
$カウンター = 1; return function() use(&$counter) {return $counter ++;}; }
$counter1 = カウンター(); $counter2 = カウンター(); echo "counter1: " . $counter1() . "
/n"; echo "counter1: " . $counter1() . "
/n"; echo "counter1: " . $counter1() . "
/n"; echo "counter1: " . $counter1() . "
/n"; echo "counter2: " . $counter2() . "
/n"; echo "counter2: " . $counter2() . "
/n"; echo "counter2: " . $counter2() . "
/n"; echo "counter2: " . $counter2() . "
/n"; ?>




クロージャの役割



1. foreach ループコードを減らす

たとえば、マニュアル http://php.net/manual/en/functions.anonymous.php のカートの例




コードをコピーします
コードは次のとおりです:


// いくつかの追加アイテムと各アイテムの数量を含む基本的なショッピング カート。
// メソッドの 1 つは、ショッピング カート内のすべてのアイテムの合計価格を計算するために使用されます。このメソッドはコールバック関数としてクロージャを使用します。
クラスカート
{
const PRICE_BUTTER = 1.00;
const PRICE_MILK = 3.00;
const PRICE_EGGS = 6.95;
protected $products = array();
パブリック関数 add($product, $quantity)
{
$this->products[$product] = $数量;
}
パブリック関数 getQuantity($product)
{
return isset($this->products[$product]) $this->products[$product] :
誤り;
}
パブリック関数 getTotal($tax)
{
$total = 0.00;
$callback =
関数 ($quantity, $product) ($tax, &$total) を使用します
{
$pricePerItem = constant(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
//ユーザー定義関数を使用して、配列内の各要素に対してコールバック処理を実行します
array_walk($this->products, $callback);
リターンラウンド($total, 2);;
}
}
$my_cart = 新しいカート;
//商品をショッピングカートに追加します
$my_cart->add('バター', 1);
$my_cart->add('ミルク', 3);
$my_cart->add('卵', 6);
// 5% の消費税を含む合計価格を出力します。
print $my_cart->getTotal(0.05) ;
//結果は54.29です
?>

ここで getTotal 関数を変更する場合は、foreach を使用する必要があります。

2. 関数パラメータを減らす

コードをコピーします コードは次のとおりです:

関数 html($code , $id="", $class=""){
if ($id !== "") $id = " id = "$id"" ;
$class = ($class !== "") " class ="$class">":">";
$open = "<$code$id$class";
$close = "";
return 関数 ($inner = "") use ($open, $close){
"$open$inner$close" を返します;
};
}

通常の方法だとhtml関数のパラメータにinnerを入れることになるので、コードの読み込みでも利用でもクロージャを使った方が良いです。

3. 再帰関数のロックを解除します

コードをコピーします コードは次のとおりです:

$fib = function($n) use(&$fib) {
If($n == 0 || $n == 1) 1 を返します;
$fib($n - 1) + $fib($n - 2) を返します;
};
echo $fib(2) . "n"; $lie = $fib;
$fib = function(){die('error');};//$fib 変数を書き換えます
echo $lie(5); // $fib がクロージャーによって参照されているためエラー

上記の質問では & が使用されていることに注意してください。ここで & が使用されていない場合、fib(n-1) は関数を見つけることができません (fib の型が以前に定義されていませんでした)

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

コードをコピーします コードは次のとおりです:
$recursive = function () use (&$recursive){
// この関数は $recursive として利用可能になりました
}

このフォーム。

4. 遅延バインディング

使用中の変数のバインドを遅らせる必要がある場合は、参照を使用する必要があります。そうしないと、定義時にコピーが作成されて使用されます

コードをコピーします コードは次のとおりです:

$結果 = 0;
$one = function()
{
var_dump($result);
};
$two = function() use ($result)
{
var_dump($result);
};
$three = function() use (&$result)
{
var_dump($result);
};
$結果++;
$one(); // NULL を出力します: $result はスコープ内にありません
$two(); // int(0) を出力します: $result がコピーされました
$three(); // int(1)を出力します

参照を使用するかどうかは、値が呼び出し時に割り当てられるか宣言時に割り当てられるかを表します

PHP の匿名関数 (クロージャー関数) について新たに理解できましたか? この記事がヒントになれば幸いです。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/959107.html技術記事 phpのクロージャ(Closure)匿名関数の詳細解説、クロージャ関数の詳細説明 PHPのクロージャ(Closure)は、PHP5.3から導入された匿名関数です。 クロージャーの構文は非常に単純ですが、注意する必要があります...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。