匿名関数で使用する機能は、親スコープから変数を継承することです。
次の例は最も一般的な使用法であり、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 は未定義変数になります。
<?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
参照渡しを使用すると、変数が関数定義より遅れている場合でも、対応する外部変数が関数内で見つかることがわかります。変数が未定義になることはありません。両者の間にはまだ違いがあります。
<?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 サイトの他の関連記事を参照してください。