Временно исправить каждую функцию () в php 8 (решено)

Я меняю сервер, перехожу с centos на ubuntu 20.04 с php 8.

Многие из моих сайтов на сервере используют этот старый класс: https://github.com/xmyl/Snoopy-2.0/blob/master/Snoopy.class.php

Сайты существуют уже давно, и я использую этот класс для доступа к различным защищенным именем пользователя и паролем областям моих партнерских программ, чтения файлов xml / rss / csv и их автоматической обработки.

Проблема в том, что этот класс часто использует функцию each(), которая ранее считалась устаревшей и теперь исключена в php 8.

Мне нужно сейчас сменить сервер (этого не ожидалось) и заставить этот класс как-то работать. После этого я могу спокойно просматривать все сценарии, обновлять их, изменять и т. Д., Но теперь мне нужно быстрое и простое решение, чтобы заставить его работать.

Я попытался изменить each() на current(), а затем добавить это:

      /**
 * Adds the depreciated each() function back into 7.2
 */
if (!function_exists('each')) {
    function each($arr) {
        $key = key($arr);
        $result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
        next($arr);
        return $result;
    }
}

Это не сработало, сценарий заканчивается на: Неустранимая ошибка: допустимый размер памяти ....

Есть быстрый и простой способ заставить его работать? (временно) Или быстрая альтернатива, которая работает так же хорошо, как и любопытный?


Просто закрыть ... решено за 5 секунд ... решение ...

      if (!function_exists('each')) {
    function each(array &$array) {
        $value = current($array);
        $key = key($array);

        if (is_null($key)) {
            return false;
        }

        // Move pointer.
        next($array);

        return array(1 => $value, 'value' => $value, 0 => $key, 'key' => $key);
    }
}

https://gist.github.com/k-gun/30dd2bf8b22329a2dbc11a045aed3859

1 ответ

Вам нужно передать массив в свой each()функция по ссылке. В том виде, в каком он сейчас записан, массив копируется в функцию, и в этой копии внутренний указатель увеличивается, не затрагивая оригинал.

      function each(&$arr) {
 /*...*/
}
Другие вопросы по тегам