【问题标题】:PHP's create_function() versus just using eval()PHP 的 create_function() 与仅使用 eval()
【发布时间】:2009-01-06 23:47:15
【问题描述】:

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

【问题讨论】:

    标签: php eval create-function


    【解决方案1】:

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

    PHP 中的匿名函数实现得非常糟糕,以至于您的代码实际上最好 使用它们。 (谢天谢地,这将在 PHP 5.3 中修复)。

    【讨论】:

    • 我喜欢 JS function() { 语法,这就是我遇到这种情况的方式,试图在 PHP 中找到类似的东西。
    • 与 JS 的实现相比,它很糟糕,而且据我记得相当慢。
    【解决方案2】:

    根据我对相关文档的理解,[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

    【讨论】:

      【解决方案3】:

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

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

      http://us.php.net/create_function

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这是不正确的。尝试在函数中使用 eval 创建函数。你也可以在functino之外调用它。函数 a() { eval('函数 b(){echo "hi\n";}'); } 一个(); b();
        【解决方案5】:

        (除了更容易)

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

        【讨论】:

        • 主要是因为我想知道是否还有其他专业人士。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        相关资源
        最近更新 更多