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

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

Jul 13, 2016 am 10:06 AM
php 無名関数 閉鎖

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles