初めに
前略、無名関数についてよく分かっていなかったので調べました。
参考
公式ドキュメント
無名関数とは
無名関数とは、関数名を指定せずに関数を作ることができる機能です。
作った関数は変数に代入したり、コールバック関数として使うことができます。
// $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などで、配列の値をコールバック関数として渡す場合も引数として渡します。
$test = function($word) {
echo "Hello " . $word . "\n";
};
$value = ["PHP", "Java"];
array_map($test, $value);
2. 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
を用いてクラスのメンバ変数にアクセスすることができます。
class Test
{
// メンバ変数を定義
private $memberValue = "メンバ変数";
public function getValue() {
$closure = function () {
// 無名関数の中で$thisを用いてメンバ変数にアクセスできる
echo $this->memberValue;
};
$closure();
}
}
$test = new Test();
$test->getValue();
一方、無名関数に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
はあまり使えてなかったので、これからは使っていこうと思います。
ここまで読んでいただきありがとうございました!