使PHP闭包函数在PHP 5.2中更安全

3
以下函数在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 ... 在第 2 行


3
PHP 5.3发布已有三年时间,而5.2已不再受支持。是否必须支持它? - ceejayoz
4
我建议更换新的托管平台。使用不受支持的PHP版本会带来重大的安全风险。 - ceejayoz
4
你的服务器被黑客攻击是一种选择吗? - ceejayoz
4
我们不会否认人们使用大多数版本的权利。我们是在一个实际的环境中运作。 - Yarin
1
不支持人们想要使用的旧版本是促使他们升级(或向他们的托管公司抱怨并升级)的好方法。 - ThiefMaster
显示剩余2条评论
3个回答

3

如果不使用闭包,您仍然可以轻松完成它,但会失去一些优雅:

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
通常在PHP<5.3中模拟闭包的方法是使用create_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;
}

1
DaveRandom- 谢谢,这个也可以 - 我把它给了 DerVO 因为他更快。 - Yarin

0

你可以这样做(未经测试)。思路是将$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时,它都会在程序内存中创建一个新函数,即使它与其他函数本质上相同,除了一个变量。因此,如果您经常调用此函数,则程序将充满虚拟函数并耗尽内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接