4

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

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.phphttp://au.php.net/create_functionhttp://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() 在对数组进行排序时非常方便。

其实我只是在网上搜索了一下,似乎PHP文档中有一个很好的例子。

http://us.php.net/create_function

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

于 2009-01-06T23:51:50.533 回答
2

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

于 2009-01-07T00:06:55.310 回答
0

(除了它更容易)

我不明白你怎么能这么轻易地驳回它。鉴于你的两个例子,哪个更容易一目了然?Create_function 告诉你你打算完成什么。评估没有。

于 2009-01-07T01:27:27.797 回答