PHPマニュアルや以前書いたエントリーへのコメントで教えて頂いたcreate_functionトリビアのまとめ。(下記全部PHP4です)
1. create_functionで作った関数は無名じゃないし、どっからでも呼べる。
% cat lambda_1.php
<?php
create_function('', 'echo "foo\n";');
call_user_func(chr(0)."lambda_1");
% php lambda_1.php
foo
2. しかし、定義済み関数には出てこない。
% cat lambda_2.php
<?php
create_function('', 'echo "foo\n";');
print_r(get_defined_functions());
% php lambda_2.php | grep lambda
%
3. でもやっぱり存在するらしい。
% cat lambda_3.php
<?php
create_function('', 'echo "foo\n";');
var_dump(function_exists(chr(0)."lambda_1"));
% php lambda_3.php
bool(true)
4. create_functionで作った関数は参照が返せない。こんなのを作っておくと便利かも。
% cat lambda_4.php
<?php
function create_ref_function($args, $code) {
static $n = 0;
$name = "ref_lambda_".++$n;
eval("function &".$name."(".$args.")"."{".$code."}");
return $name;
}
$func = create_ref_function('', 'echo "foo\n";');
call_user_func($func);
% php lambda_4.php
foo
5. create_function内での関数名は一律__lambda_func。
% cat lambda_5.php
<?php
create_function('', 'echo __FUNCTION__;');
call_user_func(chr(0)."lambda_1");
% php lambda_5.php
__lambda_func
Have a good create_function life!
参考:1byte
参考:PHP: create_function – Manual
(Life Hack系みたいにキャッチーなタイトルを付けたかっただけなんです。知っても何の生産性も上がりません。すみません・・・。)