PHPのcreate_function()とeval()だけを使用する
-
03-07-2019 - |
質問
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
他のヒント
eval()を使用するとグローバル関数リストが乱雑になりますが、create_function()は違いはありませんが、大きな違いはありません。 ただし、どちらの方法でもエラーが発生しやすいPHP文字列内に関数本体を記述する必要があります。私のプロジェクトで作業している場合は、通常の構文を使用してヘルパー関数を宣言するだけです。
PHPの匿名関数は実装が非常に不十分であるため、実際にはコードを使用しない方がよいでしょう。 (ありがたいことに、これはPHP 5.3で修正されます。)
個人的に、配列をソートするときにcreate_function()が非常に便利であることがわかりました。
実際、ウェブを検索したところ、PHPのドキュメントにその良い例があるようです。
http://us.php.net/create_function
下にスクロールして例#3コールバック関数として匿名関数を使用する。
create_function
を変数に割り当てて、関数をコードの他の部分からアクセスできるようにすることができますが、 eval
は特定のスコープでのみ役立ちます。
(より簡単であるという事実は別として)
これを簡単に却下する方法がわかりません。あなたの2つの例を考えると、一目で理解する方が簡単ですか? Create_functionは、何を達成するかを示します。評価はしません。