ホームページ  >  記事  >  バックエンド開発  >  PHPクロージャ変数のスコープ

PHPクロージャ変数のスコープ

藏色散人
藏色散人転載
2019-12-30 13:21:172409ブラウズ

プロジェクトではクロージャの形式に遭遇するのは避けられませんが、クロージャでは変数のスコープは何でしょうか?以下に簡単な例をいくつか示します。

#e1

function test_1()
{
    $a = 'php';
    $func =  function ($b) use ($a)
    {
       // $a = 'java';
        echo $b.'_'.$a;
    };
    return $func;
}
$test = test_1();
$test('hello');

上記の結果では hello_php が出力され、無名関数 func をパラメータとして使用することで $a が変数として渡されることがわかります。 ; $ a = 'java' コメントを削除すると、上記の結果が出力されます hello_java

e2: 上記の関数を

function test_2()
{
    $a = 'php';
    $func =  function ($b) use ($a)
    {
       // $a = 'go';
        echo $b.'_'.$a;
    };
    $a = 'java';
    return $func;
}
$test = test_2();
$test('hello');

として書き換えると、上記の結果が出力されますhello_php. 説明はtest_2にあります。 $a に2回目に値が代入されるとき、その値は func 関数には渡されません。

同様に、$a = 'go' が削除された場合、上記の結果は hello_go

e3 を出力します。$a

function test_3()
{
    $a = 'php';
    $func =  function ($b) use (&$a)
    {
        //$a = 'go';
        echo $b.'_'.$a;
    };
    $a = 'java';
    return $func;
}
$test = test_3();
$test('hello');
# への参照を追加します。 # #上記の結果は hello_java を出力し、アドレスが参照されるときに変数 a の値が関数 func に渡されることを示します。

同様に、$a = 'go' が削除された場合;

上記の結果は hello_go を出力します;

上記の 3 つの簡単なテストは、クロージャを明確に説明しています。 パラメータのスコープ内部。

アドレス参照を使用しない場合、外部変数が変化しても無名関数の変数値は変化しません。 (クロージャの意味)

アドレス参照使用後は、外部関数のパラメータ値によってパラメータ値が変更されます。

PHP 関連の知識について詳しくは、

PHP チュートリアル をご覧ください。

以上がPHPクロージャ変数のスコープの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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