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 行

4

3 回答 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;
}
于 2012-01-17T15:59:18.350 回答
2

通常在 PHP<5.3 中模拟闭包的方法是 withcreate_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;
}
于 2012-01-17T16:00:35.743 回答
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调用时,它都会在程序内存中创建一个永久保留的新函数,即使它与除变量之外的其他函数本质上相同。因此,如果您经常调用它,那么程序将充满虚拟函数并耗尽内存。

于 2012-01-18T01:26:35.013 回答