使PHP闭包函数对PHP5.2安全

使PHP闭包函数对PHP5.2安全,php,closures,php-5.2,Php,Closures,Php 5.2,以下函数适用于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 != "..");

以下函数适用于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_函数。。。在…上 第2行


您可以轻松地完成此操作,但您将失去一些优雅:

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;
}

通常,在PHP中模拟闭包的方法可以这样做(未经测试)。其思想是将$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\u function
,它都会在程序内存中创建一个新函数,该函数将永久保留,即使它与除变量之外的其他函数基本相同。因此,如果您经常调用这个函数,那么程序将充满虚拟函数并耗尽内存。

PHP5.3三年前问世,而5.2不再受支持。这是绝对必要的支持吗?我会得到一个新的托管平台。使用不受支持的PHP版本会使您面临严重的安全风险。ceejayoz-不是一个选项。此外,我们计划将其作为一个wp插件发布,75%的网站仍在使用5.2,只有20%的网站使用5.3是让你的服务器被黑客攻击的一个选择??我们不会剥夺人们使用多数版本的权利。我们是在现实世界中运作的。达维兰多姆——谢谢,这也行得通——把它交给了德沃,因为他速度更快。
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);
}