32
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-01-17

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

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

無名関数

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

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

32
18
1

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
  3. You can use dark theme
What you can do with signing up
32
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?