第6章 ユーザー定義関数 / 第4回 模擬試験

PHPの`use`命令(クロージャの外部変数キャプチャ)に関する次の記述のうち、正しいものはどれか。

`use (&$var)`のように参照渡しで指定すると、クロージャ内での変更が外部の変数にも反映される。 正解
`use`で取り込んだ変数は、クロージャ内で変更すると自動的に外部変数にも反映される(デフォルトで参照渡し)。
`use`命令はアロー関数(`fn`)でのみ使用できる。
`use`命令はクラスの継承に使用するキーワードである。
解説
クロージャの`use`命令は、既定では値渡し(クロージャ生成時点の値をコピー)で外部変数を取り込みます。クロージャ内での変更を呼び出し元にも反映させたい場合は、`use (&$var)`のように変数名の前に`&`を付けて参照渡しを明示する必要があります。 他の選択肢が誤りである理由は次の通りです。 ・`use ($var)`(`&`なし)はデフォルトで値渡しです。クロージャ内で変更しても、外部の変数には反映されません。「デフォルトで参照渡し」というのは誤りです。 ・`use`命令は通常の無名関数(`function () use ($var) {...}`)の構文です。アロー関数(`fn`)は`use`を書かなくても親スコープの変数を自動的にキャプチャするため、`use`命令自体を使いません。 ・`use`はクロージャの外部変数キャプチャのための命令であり、クラスの継承には`extends`キーワードを使います。 例: ``` $count = 0; $increment = function () use (&$count) { $count++; }; $increment(); $increment(); echo $count; // 2(参照渡しなので外部変数に反映される) ``` (参照: 独習PHP 第4版 第6章 ユーザー定義関数 6.4.5節 親スコープの変数を引き継ぐ p.296〜297)