2012-01-17 3 views
3

Следующая функция работает в PHP> 5.3, но ошибки в старых версиях. Как я могу изменить это, чтобы сделать его 5.2 безопасным?Создание функции закрытия PHP для PHP 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 Ошибка:

Parse error: syntax error, unexpected T_FUNCTION ... on line 2

+3

PHP 5.3 вышел три года назад, а 5.2 больше не поддерживается. Нужно ли его поддерживать? – ceejayoz

+0

Наша платформа для хостинга использует ее для WordPress. – Yarin

+4

Я бы получил новую платформу для хостинга. Использование неподдерживаемых версий PHP предоставляет вам значительные риски для безопасности. – ceejayoz

ответ

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

DerVO- это сработало - вы, человек. – Yarin

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

Смежные вопросы