私は無意識のうちに PHP がバージョン 5.5 にリリースされていることを知り、PHP5.2 を使用しています。そのため、私は山から来た田舎の若者のように見えます。 JavaScript でクロージャを使用することに慣れた後、私は突然 PHP クロージャに興味を持つようになりました。
そこで、PHP5.3 バージョンである WAMP 統合開発環境をオンラインでダウンロードしました (PHP5.3 ではクロージャー機能が導入され始めました)。WAMP はインストールして使用するのに非常に便利だと言わざるを得ません。簡単な設定が完了したら、始めてみましょう。
匿名関数
クロージャに関して言えば、クロージャ関数 (クロージャ) とも呼ばれる匿名関数を考える必要があります。PHP クロージャの実装は主にこれに依存しているようです。匿名関数の宣言は次のようになります:
$func = function() { }; //带结束符
匿名関数には名前がないため、それを使用したい場合は変数に返す必要があることがわかります。匿名関数も通常の関数と同じようにパラメータを宣言でき、呼び出し方法も同じです:
$func = function( $param ) { echo $param;};$func( 'some string' );//输出://some string
ちなみに、PHP がクロージャを導入する前には、匿名関数を作成できる関数もありました: create function ですが、コードロジックは文字列としてしか記述できません。文字列はわかりにくく保守が難しいため、文字列を使用する人はほとんどいません。
クロージャの実装
通常の関数のパラメータとして匿名関数を渡し、それを返すこともできます。これにより、単純なクロージャが実装されます。
以下に 3 つの例があります
//例一//在函数里定义一个匿名函数,并且调用它function printStr() { $func = function( $str ) { echo $str; }; $func( 'some string' );}printStr();//例二//在函数中把匿名函数返回,并且调用它function getPrintStrFunc() { $func = function( $str ) { echo $str; }; return $func;}$printStrFunc = getPrintStrFunc();$printStrFunc( 'some string' );//例三//把匿名函数当做参数传递,并且调用它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 ) { echo $rmb; echo $dollar; }; $func();}getMoney();//输出://1//报错,找不到dorllar变量
ドルが use キーワードで宣言されておらず、この匿名関数では取得できないことがわかります。そのため、開発中にこの問題に注意する必要があります。
匿名関数でコンテキスト変数を変更できるのかと疑問に思う人もいるかもしれませんが、それは不可能であることがわかりました:
function getMoney() { $rmb = 1; $func = function() use ( $rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; $func(); echo $rmb;}getMoney();//输出://1//1
ああ、use はコピーのみを参照していることがわかりました変数のそれだけです。ただし、コピーではなく、変数への完全な参照が必要です。
この効果を実現するには、変数の前に & 記号を追加するだけです:
function getMoney() { $rmb = 1; $func = function() use ( &$rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; $func(); echo $rmb;}getMoney();//输出://1//2
さて、匿名関数がコンテキスト変数を参照できるようにします。匿名関数が外部に返された場合、匿名関数は use で参照した変数を保存しますが、外部からはこれらの変数を取得できなくなります。このようにすると、「クロージャ」の概念がより明確になる可能性があります。
説明に従って上記の例を変更します。
function getMoneyFunc() { $rmb = 1; $func = function() use ( &$rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; return $func;}$getMoney = getMoneyFunc();$getMoney();$getMoney();$getMoney();//输出://1//2//3
まとめ
PHP クロージャの特性については、それほど驚くべきことではありません。実際、CLASS を使用することで、同様の関数、またはさらに強力な関数を実現できます。言うまでもなく、クロージャと比較することはできませんが、将来的には PHP のクロージャサポートの改善に期待するしかありません。ただし、匿名関数は依然として非常に便利です。たとえば、preg_replace_callback などの関数を使用する場合、コールバック関数を外部で宣言する必要はありません。