search
LoginSignup
16

More than 1 year has passed since last update.

posted at

updated at

【PHP】無名関数にuse()を使用する時の注意点

無名関数 (クロージャ)とは

関数名を指定せずに関数を作成できるようにするもの
公式

無名関数

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()に参照渡しで変数を書く時

は使いたくないな〜って気持ちです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
16