PHPクロージャ(Closure)の使い方を詳しく解説_PHPチュートリアル

WBOY
リリース: 2016-07-21 15:11:22
オリジナル
1213 人が閲覧しました

私は無意識のうちに PHP がバージョン 5.5 にリリースされていることを発見し、PHP5.2 を使用しています。そのため、私は山から来た田舎の若者のように見えます。 JavaScript でのクロージャの使用に慣れた後、私は突然 PHP のクロージャに興味を持ち始めました。

そこで、PHP5.3 バージョンである WAMP 統合開発環境をオンラインでダウンロードしました (PHP5.3 ではクロージャー機能が導入され始めました)。WAMP はインストールして使用するのに非常に便利だと言わざるを得ません。簡単な設定が完了したら、始めてみましょう。

匿名関数
クロージャに関しては、クロージャ関数(クロージャ)とも呼ばれる匿名関数を考える必要があります。PHPクロージャの実装は主にそれに依存しているようです。匿名関数の宣言は次のようになります:

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

$func = function() {

} //ターミネータ付き

;無名関数には名前がありません。使用する場合は変数に返す必要があります。匿名関数も通常の関数と同様にパラメータを宣言でき、呼び出し方法も同じです:
コードをコピー コードは次のとおりです:

$func = function( $param ) {
echo $param;
};

$func( '何らかの文字列' );

//Output:
//some string


ちなみに、PHP がクロージャーを導入する前には、匿名関数を作成できる関数 create function もありましたが、コード ロジックは文字列としてしか記述できず、非常に見栄えがします。あまり知られていないため、維持するのが簡単ではないため、使用する人はほとんどいません。

クロージャを実装する
匿名関数を通常の関数のパラメータとして渡し、それを返すこともできます。これにより、単純なクロージャが実装されます。

以下に 3 つの例があります

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

//例 1
//関数内に匿名関数を定義して呼び出します
function printStr() {
$func = function ( $str ) {
echo $str;
printStr();

//例2

//関数内で無名関数を返して呼び出す

function getPrintStrFunc() {

$func = function( $str ) {

echo $str;
};
return $func;
}

$printStrFunc = getPrintStrFunc();
$printStrFunc( '何らかの文字列' );


//例 3

//匿名関数をパラメータとして渡して呼び出します

function callFunc( $func ) {

$func( 'some string' );
}

$printStrFunc = function( $str ) {
echo $str;
};

callFunc( $printStrFunc );


//匿名関数を直接渡すこともできます。 jsを知っている人ならこの書き方はおなじみかもしれません
callFunc( function( $str ) {
echo $str;

} );



クロージャと外部変数を繋ぐキーワード: USE
クロージャは場所を保存できる 一部の変数とコードブロックコンテキストの値。 PHP のデフォルトでは、匿名関数は、それが配置されているコード ブロックのコンテキスト変数を呼び出すことはできませんが、 use キーワードを使用する必要があります。

別の例を見てみましょう:

コードをコピーします

コードは次のとおりです:function getMoney() { $rmb = 1;
$dollar = 6;
$func = function( ) use ( $rmb ) {O echo $RMB;
$ func ();
getMoney();

//出力:
//1
//エラーレポート、ドル変数が見つかりません


ご覧のとおり、 use キーワードでドルが宣言されておらず、この匿名関数では取得できないため、開発中ですのでご注意ください。

匿名関数でコンテキスト変数を変更できるのかと疑問に思う人もいるかもしれませんが、それは不可能であることがわかりました:




コードをコピー


コードは次のとおりです:

function getMoney() {
$rmb = 1;

$func = function() use ( $rmb ) { echo $rmb; $func = $func = エコー $rmb; getMoney(); //出力:
//1
//1


ああ、use が参照しているのは変数の単なるコピーであることがわかりました。ただし、コピーではなく、変数への完全な参照が必要です。

この効果を実現するには、変数の前に & 記号を追加するだけです:

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

function getMoney() {
$rmb = 1;
$func = function( ) use ( &$rmb ) {
echo $rmb;
getMoney();

//出力:
//1
//2

さて、匿名関数はコンテキスト変数を参照できます。匿名関数を外部に返すと、匿名関数は use で参照した変数を保存しますが、外部からはこれらの変数を取得できなくなります。このようにすると、「クロージャ」の概念がより明確になるかもしれません。


説明に従って上記の例を変更します:


コードをコピーします

コードは次のとおりです:

function getMoneyFunc() { $rmb = 1; $func = function() use ( &$rmb ) { R Echo $ RMB // $ RMB 1 $ RMB ++ の値を加算します
$ func;
$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();

//出力:
//1
//2
//3

概要
PHP クロージャの特性については、それほど驚くべきことではありません。実際、CLASS を使用することで、同様の機能、またはさらに強力な機能を実現できます。ましてや JS のクロージャは同等であり、将来的には PHP のクロージャ サポートの改善に期待するほかありません。ただし、匿名関数は依然として非常に便利です。たとえば、preg_replace_callback などの関数を使用する場合、コールバック関数を外部で宣言する必要はありません。



http://www.bkjia.com/PHPjc/326881.html

www.bkjia.com


tru​​e

http://www.bkjia.com/PHPjc/326881.html技術記事

知らず知らずのうちに、PHP がバージョン 5.5 にリリースされていることを知り、私は PHP5.2 を使用しています。このため、私は山から来た田舎の若者のように見えます。私は JavaScript でクロージャーを使用することに慣れています...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!