0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP】無名関数について

Posted at

初めに

前略、無名関数についてよく分かっていなかったので調べました。

参考

公式ドキュメント

無名関数とは

無名関数とは、関数名を指定せずに関数を作ることができる機能です。
作った関数は変数に代入したり、コールバック関数として使うことができます。

無名関数の例
// $testに無名関数を代入
$test = function() {
    echo "Hello PHP!";
};

// 代入した無名関数を呼び出す
$test();  // Hello PHP!

無名関数を試してみる

ということで、いろいろ試してみます。

引数の渡し方

無名関数で使う値を引数の渡し方は2種類あります。

1. 変数を引数で値を渡す

無名関数の呼び出し時に引数を渡す方法です。
動的な値の受け渡しに適しています。

無名関数呼び出し時、通常の引数を渡すことができる
// 引数を渡すことができる
$test = function($word) {
    echo "Hello " . $word;
};

$test("PHP");  // Hello PHP
$test("Java");  // Hello Java

array_mapなどで、配列の値をコールバック関数として渡す場合も引数として渡します。

array_mapで渡す時は通常の引数を用いる
$test = function($word) {
    echo "Hello " . $word . "\n";
};
$value = ["PHP", "Java"];

array_map($test, $value);

2. useで値を渡す

useを使うことで、無名関数の定義時に値を渡すことができます。
静的な受け渡しに適しています。

useを使って無名関数の定義時に値を渡す
// 変数を定義
$HELLO = "Hello";

// useで変数を渡すことができる
$test = function($word) use ($HELLO) {
    echo $HELLO ." ". $word;
};

$test("PHP");  // Hello PHP
$test("Java");  // Hello Java

useで引き渡す際は、関数が定義された時点の値になります。関数が呼び出される時点ではなく、定義時の値が使用されます。

// 変数を定義
$HELLO = "Hello";

// useで渡す
$test = function($word) use ($HELLO) {
    echo $HELLO ." ". $word;
};

// 変数を上書き
$HELLO = "こんにちは";

$test("PHP");  // Hello PHP

staticな無名関数

無名関数にstaticをつけることができます。これにより、現在のクラスやオブジェクトに自動的にバインドされなくなり、$thisを使えなくなります。

次の例では、無名関数がstaticをつけていないため、$thisを用いてクラスのメンバ変数にアクセスすることができます。

staticでない無名関数は$thisを利用できる
class Test 
{
    // メンバ変数を定義
    private $memberValue = "メンバ変数";

    public function getValue() {

        $closure = function () {
            // 無名関数の中で$thisを用いてメンバ変数にアクセスできる
            echo $this->memberValue;
        };

        $closure();
    }
}

$test = new Test();
$test->getValue();

一方、無名関数にstaticを付けると、$thisは無効になります。したがって、メンバ変数にアクセスできなくなります。

staticば無名関数は$thisは使えない
class Test 
{
    // メンバ変数を定義
    private $memberValue = "メンバ変数";

    public function getValue() {

        $closure = static function () {
            // staticな無名関数の中では$thisはエラーになる
            // echo $this->memberValue;
            echo '$this使えませんでした';
        };

        $closure();
    }
}

$test = new Test();
$test->getValue();

終わりに

今回は無名関数について調べました。
引数で渡してばかりでuseはあまり使えてなかったので、これからは使っていこうと思います。

ここまで読んでいただきありがとうございました!

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?