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

怪我咯
リリース: 2023-03-11 17:50:01
オリジナル
2036 人が閲覧しました

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

次の例は最も一般的な使用法であり、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 サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!