Проблема с обновлением php до 8.1 на битрексе

Рейтинг: 0Ответов: 1Опубликовано: 28.02.2023

При обновлении на php 8.0 сайт на битриксе выдаёт ошибку:

call_user_func_array(): Argument #1 ($callback) must be a valid callback,
non-static method WRPRedirect::ManualRedirect()
cannot be called statically (0)
/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465

Погуглил сказали добавить static перед функцией, добавил ошибка изменилась:

syntax error, unexpected identifier "ExecuteModuleEventEx", expecting "(" (0)
/home/bitrix/ext_www/test2.1219103-ca50289.tw1.ru/bitrix/modules/main/classes/general/module.php:424
#0: require_once
    /home/bitrix/ext_www/test2.1219103-ca50289.tw1.ru/bitrix/modules/main/include.php:14
#1: require_once(string)
    /home/bitrix/ext_www/test2.1219103-ca50289.tw1.ru/bitrix/modules/main/include/prolog_before.php:14
#2: require_once(string)
    /home/bitrix/ext_www/test2.1219103-ca50289.tw1.ru/bitrix/modules/main/include/prolog.php:10
#3: require_once(string)
    /home/bitrix/ext_www/test2.1219103-ca50289.tw1.ru/bitrix/header.php:1
#4: require(string)
    /home/bitrix/ext_www/test2.1219103-ca50289.tw1.ru/index.php:1

Погуглил говорят что лишняя скобка, проверяю уже несколько раз файл найти не могу

static function ExecuteModuleEventEx($arEvent, $arParams = array()) # в этой строке ошибка
{
    $r = true;

    if(
        isset($arEvent["TO_MODULE_ID"])
        && $arEvent["TO_MODULE_ID"]<>""
        && $arEvent["TO_MODULE_ID"]<>"main"
    )
    {
        if(!CModule::IncludeModule($arEvent["TO_MODULE_ID"]))
            return null;
    }
    elseif(
        isset($arEvent["TO_PATH"])
        && $arEvent["TO_PATH"]<>""
        && file_exists($_SERVER["DOCUMENT_ROOT"].BX_ROOT.$arEvent["TO_PATH"])
    )
    {
        $r = include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT.$arEvent["TO_PATH"]);
    }
    elseif(
        isset($arEvent["FULL_PATH"])
        && $arEvent["FULL_PATH"]<>""
        && file_exists($arEvent["FULL_PATH"])
    )
    {
        $r = include_once($arEvent["FULL_PATH"]);
    }

    if(array_key_exists("CALLBACK", $arEvent))
    {
        //TODO: Возможно заменить на EventManager::getInstance()->getLastEvent();
        global $BX_MODULE_EVENT_LAST;
        $BX_MODULE_EVENT_LAST = $arEvent;

        if(isset($arEvent["TO_METHOD_ARG"]) && is_array($arEvent["TO_METHOD_ARG"]) && count($arEvent["TO_METHOD_ARG"]))
            $args = array_merge($arEvent["TO_METHOD_ARG"], $arParams);
        else
            $args = $arParams;

        return call_user_func_array($arEvent["CALLBACK"], $args);
    }
    elseif($arEvent["TO_CLASS"] != "" && $arEvent["TO_METHOD"] != "")
    {
        //TODO: Возможно заменить на EventManager::getInstance()->getLastEvent();
        global $BX_MODULE_EVENT_LAST;
        $BX_MODULE_EVENT_LAST = $arEvent;

        if(is_array($arEvent["TO_METHOD_ARG"]) && count($arEvent["TO_METHOD_ARG"]))
            $args = array_merge($arEvent["TO_METHOD_ARG"], $arParams);
        else
            $args = $arParams;

        //php bug: http://bugs.php.net/bug.php?id=47948
        class_exists($arEvent["TO_CLASS"]);
        return call_user_func_array(array($arEvent["TO_CLASS"], $arEvent["TO_METHOD"]), $args);
    }
    else
    {
        return $r;
    }
}

Ответы

▲ 1Принят

ExecuteModuleEventEx это запуск обработки событий и ошибка говорит о том что функция, которая вызывается в процессе этого события не объявлена как static.

Необходимо найти класс WRPRedirect и метод ManualRedirect в нём сделать статичным.