無名関数 (クロージャ)とは
関数名を指定せずに関数を作成できるようにするもの
公式
無名関数
pattern1
$func = function() {
echo 'Hello!';
}; // ←『;』をつけ忘れないように注意!
$func();
// Hello!
###即時関数
patter2
(function() {
echo 'Hello!';
})();
// Hello!
こちらも広義の意味で、無名関数です。PHPが()を認識したタイミングで関数が実行される仕組みとなっています
では、こちらは??
// 世界1
$word = 'Hello!!';
$func = function() {
// 世界2
echo $word;
};
$func();
//PHP Notice: Undefined variable: ・・・
こちらはエラーになります。一見、動いても良さそうに見えますね。
これは「世界1」と「世界2」では、参照できる変数が異なるのでエラーが出ます。
「世界1」から「世界2」に変数を渡すことできるのが、use()
use()を使ってみよう!
// 世界1
$word = 'Hello!!';
$func = function() use($word) {
// 世界2
echo $word;
};
$func();
// 'Hello!!'
できた! use($word)
することで、「世界2」でも「世界1」の変数$word
を参照するようになります。
【本題】 use()の注意点
$word = 'Hello!!';
$func = function() use($word) {
echo $word;
};
$word = 'Good Morning!';
$func();
// Hello!
こちらは、「Hello!」と出力されます!
use()は定義された時の変数を参照することに注意してください!
これは回避する方法
$word = 'Hello!!';
$func = function() use(&$word) { // ←参照渡しにする
echo $word;
};
$word = 'Good Morning!';
unset($word);
$func();
// Good Morning!'
$word
を参照渡しにすることで回避できます。ただ、再度$word
に値を代入されると挙動が変わってしまうので、unset()
で変数の割当を解除するようにしましょう。
まとめ
無名関数を使うとスコープを小さくできるので、私はすごく好きです。
- use()に変数を3個以上書く時
- use()に参照渡しで変数を書く時
は使いたくないな〜って気持ちです。