PHPでクロージャを定義する

2021/01/12に公開

PHPは、JavaScriptのようにクロージャを定義することはできません。

<?php

$var = 10;
$result = array_map(function($num){
    return $var * $num;
},[1,2]);

print_r($result)
?>

//PHP Notice:  Undefined variable: var in /workspace/Main.php on line 5

varが未定義というエラーが出ているため、array_mapの第一引数に渡している無名関数内で$varを参照できていません。

例えば、このようなコードをJavaScriptで実行してみると

const value = 10;
const result = [1, 2].map((x) => value * x);

console.log(result); //[ 10, 20 ]

valueの値が参照できています。

ではPHPで関数の外側の変数の値を参照したい際はどうすればいいのか?

そこで use() を使うことで参照できます。

<?php

$var = 10;
$result = array_map(function($num)use($var){
    return $var * $num;
},[1,2]);

print_r($result)
?>

/*
Array
(
    [0] => 10
    [1] => 20
)
*/

参照できました。

なぜuse()を使用しないと関数の外側の変数の値を参照できないのかは、不思議ですが…
(おそらくPHPには変数宣言キーワードがないから?)

以上、PHPでクロージャを定義する方法でした。

Discussion