4

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 は本当に優れていますか? (それがより簡単であるという事実は別として)

4

5 に答える 5

6

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

PHPの無名関数は実装が不十分であるため、実際にはそれらを使用しない方がコードに適しています。(ありがたいことに、これはPHP 5.3で修正されます)。

于 2009-01-07T00:29:38.977 に答える
5

関連するドキュメントの私の理解では、[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

于 2009-03-13T11:53:50.480 に答える
3

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

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

http://us.php.net/create_function

Example #3 Using anonymous functions as callback functionsまでスクロールします。

于 2009-01-06T23:51:50.533 に答える
2

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

于 2009-01-07T00:06:55.310 に答える
0

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

どうしてそんなに簡単にこれを却下できるのか理解できません。あなたの 2 つの例を考えると、どちらが一目で理解しやすいですか? Create_function は、何を達成しようとしているのかを示します。Eval はしません。

于 2009-01-07T01:27:27.797 に答える