【问题标题】:Making a PHP closure function safe for PHP 5.2使 PHP 闭包函数对 PHP 5.2 安全
【发布时间】:2012-02-12 10:13:57
【问题描述】:

以下函数在 PHP > 5.3 中有效,但在旧版本中出错。如何修改它以使其 5.2 安全?

function _iniloader_get_dirs($dir) {
        $dirs = array_filter(scandir($dir), function ($item) use ($dir) {
            return (is_dir($dir.'/'.$item) && $item != "." && $item != "..");
        });
        // Use array_values to reset the array keys:
        return array_values($dirs);
}

5.2 错误:

解析错误:语法错误,意外的 T_FUNCTION ... on 第 2 行

【问题讨论】:

  • PHP 5.3 是三年前出来的,现在不再支持 5.2。有必要支持吗?
  • 我会得到一个新的托管平台。使用不受支持的 PHP 版本会使您面临重大的安全风险。
  • ceejayoz- 不是一个选项。此外,我们计划将其作为 wp 插件发布,75% 的网站仍在使用 5.2,只有 20% 使用 5.3
  • 让你的服务器被黑是一种选择吗?
  • ?我们不会拒绝人们使用多数版本的权利。我们在真实世界的环境中运作。

标签: php closures php-5.2


【解决方案1】:

你可以很容易地在没有闭包的情况下做到这一点,但你会失去一些优雅:

function _iniloader_get_dirs($dir) {
    $dirs = array();
    $entries = scandir($dir);
    foreach($entries as $item) {
        if($item === '.' || $item === '..') continue;
        if(!is_dir($dir.'/'.$item)) continue;
        $dirs[] = $item;
    }
    return $dirs;
}

【讨论】:

    【解决方案2】:

    通常在 PHPcreate_function() 但由于在这种情况下使用了 use 子句,我无法想出一种方法来做到这一点,而无需做一些可怕的事情,包括通过弹跳变量全局范围。我可能缺少一些东西。

    无论如何,这里有一些不需要闭包就能做同样事情的代码:

    function _iniloader_get_dirs($dir) {
        $dirs = array();
        foreach (scandir($dir) as $item) {
            if (is_dir($dir.'/'.$item) && !in_array($item, array('.', '..'))) {
                $dirs[] = $item;
            }
        }
        return $dirs;
    }
    

    【讨论】:

    • DaveRandom- 谢谢,这也行得通- 把它交给 DerVO,因为他速度更快。
    【解决方案3】:

    您可以这样做(未经测试)。这个想法是将 $dir 的值插入到函数的源代码中。

    function _iniloader_get_dirs($dir) {
        $dirs = array_filter(scandir($dir),
            create_function('$item', '$dir = \'' . $dir . '\';' .
                'return (is_dir($dir."/".$item) && $item != "." && $item != "..");'));
        return array_values($dirs);
    }
    

    如果你经常调用这个函数要小心,因为每次调用create_function 时,它都会在程序内存中创建一个永久保留的新函数,即使它本质上与除变量之外的其他函数相同。所以如果你经常调用这个,那么程序将充满虚拟函数并耗尽内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 2013-09-12
      • 2011-09-16
      相关资源
      最近更新 更多