PHP create_function関数(クロージャとか)

PHPのcreate_function関数でクロージャっていう話(乗り遅れてますが)。

昨日のエントリで、書きました。

create_functionで面白いと思ったところは、” と “” を使い分けることで変数の評価タイミングを制御できるところでした。

” で囲んである文字列は、map実行時に評価される。

“” で囲んである文字列は、定義時に評価される。

っていうか、マトモな無名関数がないから成せる技?

lisp 勉強してたから理解が速かったのかも。

http://d.hatena.ne.jp/smeghead/20070529/cookie
<?php
function setCookies($keys) {
$expire = time() + (3600 * 24 * 30);
array_map(
create_function(
'$key',
'setCookie($key, $_REQUEST[$key], ' . "$expire, '/phpapp');"),
$keys);
}
?>

$expireは、create_function関数呼出し時の値が使われて、$keyと$_REQUEST[$key]は、array_mapから、なんちゃって匿名関数が呼ばれた時の値(引数だから当たり前)が使われる。


ようするに、”で囲んだ部分の変数は、ダイナミックスコープの変数であり、””で囲んだ部分の変数は、変更不可能なレキシカルスコープの変数みたいな感じで使えるってことですね。変更不可能ってとこが、使い道に困るところですが。


id:m_kubota:20070529 で、m_kubotaさんがstatic変数を使うことで、なんちゃってレキシカル環境の変数を変更可能にしていました。


変数の評価タイミングと、static変数と組み合わせたら、バカっぽいことができそうな、できなさそうな。。。

追記

id:mokehehe:20070530:closure

あ、PHPの変数は正確にはダイナミックスコープですらないのか。もっと遊ぶためには、PHPのスコープを知らないとだめみたいですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください