質問

PHPには、次のような一意の名前付きラムダ関数を作成するcreate_function()関数があります。

$myFunction = create_function('$foo', 'return $foo;');
$myFunction('bar'); //Returns bar

これは実際には、より簡単ですか?

do{
 $myFunction = 'createdFunction_'.rand();
}
while(function_exists($myFunction));
eval("function $myFunction(\$foo) { return \$foo; }");
$myFunction('bar'); //Returns bar

create_functionは本当に優れていますか? (より簡単であるという事実は別として)

役に立ちましたか?

解決

関連するドキュメントの私の理解では、[1]それらは両方とも同じことを行います。create_function()はあなたのためにユニークな関数名を思いつくだけです。

この質問に関する他のコメントに対処するには:

  

create_functionを変数に割り当てると、関数がコードの他の部分からアクセスできるようになりますが、evalは特定のスコープでのみ役立ちます。

eval()は現在のスコープで実行される可能性がありますが、とにかく関数定義はグローバル名前空間にダンプされます。[2]したがって、関数を定義するときはいつでも、プログラムの他のどこからでもアクセスできます。

  

eval()を使用すると、グローバル関数リストが乱雑になりますが、create_function()はそうなりません

create_function()は、特別なコールバックタイプではなく、新しい関数の名前の文字列のみを返します[3]。そのため、どちらの手法もグローバルネームスペースを汚染します。

いいえ、create_function()は簡単ですが、eval()より優れているようには見えません。

脚注:

[1] http://au2.php.net/manual /en/functions.user-defined.php ; http://au.php.net/create_function ; http://au.php.net/eval

[2] http://au2.php.net/manual /en/functions.user-defined.php

[3] http://au.php.net/create_function

他のヒント

eval()を使用するとグローバル関数リストが乱雑になりますが、create_function()は違いはありませんが、大きな違いはありません。 ただし、どちらの方法でもエラーが発生しやすいPHP文字列内に関数本体を記述する必要があります。私のプロジェクトで作業している場合は、通常の構文を使用してヘルパー関数を宣言するだけです。

PHPの匿名関数は実装が非常に不十分であるため、実際にはコードを使用しない方がよいでしょう。 (ありがたいことに、これはPHP 5.3で修正されます。)

個人的に、配列をソートするときにcreate_function()が非常に便利であることがわかりました。

実際、ウェブを検索したところ、PHPのドキュメントにその良い例があるようです。

http://us.php.net/create_function

下にスクロールして例#3コールバック関数として匿名関数を使用する

create_function を変数に割り当てて、関数をコードの他の部分からアクセスできるようにすることができますが、 eval は特定のスコープでのみ役立ちます。

(より簡単であるという事実は別として)

これを簡単に却下する方法がわかりません。あなたの2つの例を考えると、一目で理解する方が簡単ですか? Create_functionは、何を達成するかを示します。評価はしません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top