ホームページ  >  記事  >  バックエンド開発  >  PHP クロージャの詳細な紹介 (コード付き)

PHP クロージャの詳細な紹介 (コード付き)

不言
不言転載
2019-04-12 10:07:072433ブラウズ

この記事では、PHP クロージャの詳細な紹介 (コード付き) を紹介します。これには一定の参考価値があります。必要な友人は参照できます。お役に立てば幸いです。

PHP のクロージャーについての説明をたくさん読みました。どのドキュメントもほぼ同じ意味を表現したいと考えていますが、非常に理解しにくいです。私自身の理解に基づいて説明しています。よりよく理解されている場合は、ご指摘ください

ご存知のとおり、PHP のクロージャーは function () use (){};

この記事は 3 つのステップに分かれています:

1. クロージャ Use について説明する
1: クロージャでの use の使用 - パート 1

function () use($param){};
$param = 1;
$data = function () use ($param)
{
    var_dump($param);    
};

$data();

$param = 2;
$data();

// 输出结果为
1
1

解析結果: use 使い方はオブジェクト(クラスの使い方) $data() と同等で一度インスタンス化することを意味しますが、言語としては テキストストリームの性質を持ち、 2回目 $data() 再インスタンスはありません、インスタンス時の取得値は1なので出力結果は上記の結果となります;

2: での使用クロージャ - パート 2

$param = 1;
$data = function () use ($param)
{
    var_dump($param);    
};

$data();

$param = 2;
$data = function () use ($param)
{
    var_dump($param);    
};
$data();

// 输出结果为
1
2

分析結果 : テキスト ストリーム の形式で、変数が再度インスタンス化されるため、格納変数は 2 となり、最終出力は 2 になります。

3: クロージャ内の function() の後の括弧、 use の前の括弧 使用法

function ($obj) use($param){};
    $param = 1;
    $data = function ($obj) use ($param)
    {
        var_dump($obj);
        var_dump($param);    
    };
    $data(2);
    
    $data(3);
    
    $param = 2;
    $data(4);
    // 输出
    2
    1
    
    3
    1
    
    4
    1

分析結果: 関数の後の括弧は、関数が呼び出されるたびに関数の使用法に相当します。これは毎回データを渡すのと同じであり、その後ろの使用法は、インスタンスが一度実行された後は変更されないことを意味します。したがって、obj はいつでも変更できます。

2. クロージャ インスタンス

例 1:

    $arr = [
        '米' => ['咸粥', '甜粥', '米饭'], 
        '面' => ['面条', '花卷', '馒头'], 
    ];

    $param = '';
    $bag = function ($data) use ($param)
    {
        $l = count($data);
        return $data[rand(0, $l-1)];
    };

    $eat_arr = [];
    
    foreach ($arr as $key => $value) {
        $each_arr[] = '吃'.$key.':'.$bag($value);        
    }

    echo implode(',', $each_arr);
    
    // 输出
    吃米:米饭,  吃面:面条
    吃米:甜粥,  吃面:馒头

例 2:

    $arr = [
        '米' => ['咸粥', '甜粥', '米饭'], 
        '面' => ['面条', '花卷', '馒头'], 
    ];

    $eat_arr = [];
    
    foreach ($arr as $key => $value) 
    {
        $bag = function () use ($value)
        {
            $l = count($value);
            return $value[rand(0, $l-1)];
        };

        $each_arr[] = '吃'.$key.':'.$bag();        
    }

    echo implode(',', $each_arr);
    // 输出
    吃米:甜粥, 吃面:面条
    吃米:甜粥, 吃面:花卷

3. クロージャの概要

クロージャ関数との違いは、使用中間値が追加されている点です。使用する場合は、function の後の () が変数変数であり、use() 内の変数は 以降のインスタンスであることに注意してください。変数が変化しないため、ループ内でクロージャを記述することはあまり役に立ちません。これは毎回クロージャをインスタンス化することと同じであるため、呼び出す前にメソッドを定義することでクロージャを記述することができます。

クロージャと関数の本当の違い:

関数: 複数の呼び出しを一度にカプセル化します。
クロージャ: この方法でのみ使用されます。結合度は無視できるほど低いです。

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

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。