Обеспечение безопасности функции закрытия PHP для PHP 5.2 - PullRequest
3 голосов
/ 17 января 2012

Следующая функция работает в 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

Ответы [ 3 ]

3 голосов
/ 17 января 2012

Вы можете легко сделать это без закрытия, но вы потеряете некоторую элегантность:

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 голосов
/ 17 января 2012

Обычно способ имитировать замыкания в PHP <5.3 - это <a href="http://php.net/manual/en/function.create-function.php" rel="nofollow">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;
}
0 голосов
/ 18 января 2012

Вы можете сделать это так (не проверено).Идея состоит в том, чтобы вставить значение $ 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, она создает новую функцию впамять программы, которая остается навсегда, даже если она по существу такая же, как и у других функций, кроме переменной.Поэтому, если вы будете часто это называть, программа будет заполнена фиктивными функциями и не хватит памяти.

...