menu
書いてる野郎
orebike@gmail.com
PHP5.3から使えるようになった。これは使いたい!
JavaScriptと同様に作れる。
$hoge = function($a){ echo $a; }; $hoge("ほげ");
このように使う。
クロージャの特徴的な機能のひとつに定義されたスコープを実行時に持ち込めるというものがある。なのでPHPでもやってみる。
$outer = "外からだよ"; $hoge = function($a){ echo $a . $outer; }; $hoge("ほげ");
こいつを実行するとouterなんて変数分かんねーよボケ!というエラーが出るのでJavaScriptっぽく記述しても内部には持ち込めないようだ。
PHP: 無名関数 - Manualによるとuseキーワードで持ち込める
$outer = "外からだよ"; $hoge = function($a) use($outer){ echo $a . $outer; }; $hoge("ほげ");
これで動く
$outer = "外からだよ"; $hoge = function($a) use($outer){ echo $a . $outer; }; $hoge("ほげ");
ここで少し意地悪をして
$outer = "外からだよ"; $hoge = function($a) use($outer){ echo $a . $outer; }; $outer = $outer . "変わるよ"; $hoge("ほげ");
こう記述しても「変わるよ」表示されず。つまりuseを使ってるのに引数で値渡ししているのと同じ。つまり作る時点でのサブ的なパラメータを与えているだけ。(使う時点ではもう一体化してるところがポイント)
ここでアンバサンドをつけてuseで引きこむと変数の値ではなく変数そのものを引き込むことができるようになる
$outer = "外からだよ"; $hoge = function($a) use(&$outer){ echo $a . $outer; }; $outer = $outer . "変わるよ"; $hoge("ほげ");
これだと「変わるよ」が出る。