読者です 読者をやめる 読者になる 読者になる

create_functionはクロージャにはなれない

php

Rubyだとこんな感じで書ける

def counter
  i = 0
  lambda{|n| i += n}
end

count = counter
puts count.call(1) #=> 1
puts count.call(2) #=> 3
puts count.call(3) #=> 6


PHPの場合も同じ結果を期待したけど、クロージャとしては動いてくれないらしい。

<?php
function counter() {
	$i = 0;
	return create_function('$n',"$i = $i + $n;"); 
}

$func = counter();
echo $func(1); // Parse error: syntax error, unexpected '='
echo $func(3);
echo $func(5);


文字列をダブルクォーテーションで囲っているため、$iは文字列内で変数として評価されてしまう。
そのため、create_function内では以下のような式が入ることになる。

0 = 0 + 1

そりゃ動かないわな。

ちなみにシングルクォーテーションにすると、function内のローカル変数扱いになるため、外の変数は参照されません。

5.3のλ導入までは使えないってことですかね。