ホームページ  >  記事  >  バックエンド開発  >  PHPの匿名関数での使用の用途は何ですか

PHPの匿名関数での使用の用途は何ですか

怪我咯
怪我咯オリジナル
2017-06-28 11:43:282108ブラウズ

匿名関数で使用する機能は、親スコープから変数を継承することです。

次の例は最も一般的な使用法であり、use が使用されない場合、変数 $msg は関数内で見つかりません。

<?php
$msg = [1,2,3];
$func = function()use($msg){
    print_r($msg);
};  

$func();
?>

出力の実行

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

変数の継承タイミングについて

継承変数の動作は関数定義時と関数呼び出し時どちらで生成されるのでしょうか?上記の例のコードの順序を調整して、$msg を関数定義の後に配置してみましょう。

<?php
$func = function()use($msg){
    print_r($msg);
};  

$msg = [1,2,3];

$func();
?>

実行出力

PHP Notice:  Undefined variable: msg in /search/ballqiu/c.php on line 4

関数定義時に継承変数の動作が生成されていることが分かります。上記の例では

msg が定義されているため、関数実行時には $msg は未定義変数になります。


reference使用時の値渡しについて匿名関数の使用時に値を渡すためにリファレンスを使用する場合、匿名関数のパラメータ値の変更は対応する外部にも影響することがわかっています。変数。たとえば、次の例:

<?php
$msg = [1,2,3];
$func = function()use(&$msg){
    $msg[0]++;
    print_r($msg);
};


$func();

print_r($msg);
?>

出力を実行

Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)

つまり、いずれの場合でも、匿名関数を通じて外部変数の値を変更したい場合は、参照によって使用する値を渡す必要がありますか?次の例を見てください:

<?php
$msg = new ArrayObject([1,2,3], ArrayObject::ARRAY_AS_PROPS);
$func = function()use($msg){
    $msg[0]++;
    print_r($msg);
};

$func();
print_r($msg);
?>

出力の実行

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => 2
            [1] => 2
            [2] => 3
        )

)
ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => 2
            [1] => 2
            [2] => 3
        )

)

オブジェクトクラス

型の変数を渡すと、それが参照渡しでなくても、匿名関数の変数値が変化することがわかります。外部関連変数にも影響します。
しかし、問題は再び起こります。オブジェクト変数を渡して使用する場合、参照を使用する場合と使用しない場合に違いはありますか?例を見てみましょう

<?php
$func = function()use($msg){
    echo $msg[0],"\n";
};

$msg = new ArrayObject([1,2,3], ArrayObject::ARRAY_AS_PROPS);
$func();
?>

代わりに参照渡しを使用します

$func = function()use(&$msg){
    echo $msg[0],"\n";
};

运行输出1

参照渡しを使用すると、変数が関数定義より遅れている場合でも、対応する外部変数が関数内で見つかることがわかります。変数が未定義になることはありません。両者の間にはまだ違いがあります。


これとクラス内の匿名関数でのuseについて

<?phpclass C{
    protected $_num = 0;    public function mkFunc(){
        $func = function(){
            echo $this->_num++, "\n";
        };        return $func;
    }    public function get(){
        echo $this->_num,"\n";
    }
}$obj = new C();$func = $obj->mkFunc();$func();$obj->get();?>
运行结果01
匿名関数のthisは現在の

オブジェクト

を参照していることがわかり、useを使わずに直接見つけることができます。 上記の例でも、use を使用しなければならない場合、どのような影響があるでしょうか?

mkFuncを

public function mkFunc(){
    //唯一改动是此处加了use
    $func = function()use($this){
        echo $this->_num++, "\n";
    };    return $func;
}

运行输出
PHP Fatal error:  Cannot use $this as lexical variable

public function mkFunc(){
    $self = $this;    $func = function()use($self){
        echo $this->_num++, "\n";
    };    return $func;
}

运行结果01

に変更すると、どちらを使用しても効果が同じであることが分かります。

以上がPHPの匿名関数での使用の用途は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。