PHP におけるクロージャーの詳細な説明 (詳細な例付き)

王林
リリース: 2023-04-07 11:06:01
転載
3105 人が閲覧しました

匿名関数

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

$func = function() {

 }; //带结束符
ログイン後にコピー

ご覧のとおり、匿名関数には名前がないため、それを使用したい場合は変数に返す必要があります。匿名関数も通常の関数と同じようにパラメータを宣言でき、呼び出し方法も同じです:

$func = function( $param ) {
    echo $param;
};$func( 'some string' );
 //输出:
 //some string
ログイン後にコピー

ちなみに、PHP がクロージャを導入する前には、匿名関数を作成できる関数もありました: create function ですが、コードのロジックは文字列としてしか記述できませんが、見た目がわかりにくく保守が難しいため、使用する人はほとんどいません。

クロージャの実装

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

//例一
//在函数里定义一个匿名函数,并且调用它
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

function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}getMoney();
//输出:
//1
//报错,找不到dorllar变量
ログイン後にコピー

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

ご覧のとおり、ドルは 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 などの関数を使用する場合、コールバック関数を外部で宣言する必要はありません。

その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください: PHP ビデオ チュートリアル

以上がPHP におけるクロージャーの詳細な説明 (詳細な例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート