PHP的create_function()与仅使用eval()

时间:2009-01-06 23:47:15

标签: php eval create-function

在PHP中,你有create_function()函数,它创建一个唯一的命名lambda函数,如下所示:

$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真的更好吗? (除了事实上它更容易)

5 个答案:

答案 0 :(得分:6)

使用eval()会使全局函数列表混乱,create_function()也不会,除此之外没有太大的区别。 然而,这两种方法都需要在容易出错的PHP字符串中编写函数体,如果你正在处理我的项目,我会命令你使用普通语法声明一个辅助函数。

PHP中的匿名函数实现得太差,以至于您的代码实际上更好地使用它们而不是。 (值得庆幸的是,这将在PHP 5.3中修复。)

答案 1 :(得分: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

答案 2 :(得分:3)

就个人而言,我发现在排序数组时,create_function()非常方便。

事实上,我刚刚在网上搜索过,似乎PHP文档就是一个很好的例子。

http://us.php.net/create_function

向下滚动到示例#3使用匿名函数作为回调函数

答案 3 :(得分:2)

可以将

create_function分配给变量,使代码的其他部分可以访问该函数,而eval仅对给定范围有用。

答案 4 :(得分:0)

(除了事实上它更容易)

我不明白你怎么这么容易解雇这个。鉴于您的两个例子,一目了然更容易理解? Create_function告诉您打算完成的任务。 Eval没有。