php匿名関数と閉パッケージ

3835 ワード

いつの間にかPHPは5.5バージョンまで出ていて、自分はずっとPHP 5を使っています.2、山奥から出てきた若者のように、土も立ち後れているように見えます.Javascriptでクローズドパッケージを使うことに慣れた後、PHPのクローズドパッケージに興味を持ちました.
そこでネット上でWAMP集積開発環境を作りました.PHP 5です.3バージョンの(PHP 5.3は閉パッケージの特性を導入し始めた)は、WAMPのインストールが本当に便利だと言わざるを得ません.簡単に配置して、始めました.
匿名関数は閉パッケージといえば匿名関数を思い出さざるを得ない.閉パッケージ関数(closures)とも呼ばれ、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


dollarは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は、類似した強力な機能を実現することができます.jsの閉パッケージとは比べものにならないので、PHP以降の閉パッケージサポートの改善を期待するしかありません.しかし、preg_を使用するなど、匿名関数は役に立ちます.replace_callbackなどの関数は、外部でコールバック関数を宣言する必要はありません.