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系みたいにキャッチーなタイトルを付けたかっただけなんです。知っても何の生産性も上がりません。すみません・・・。)

Comments


Option