Проблемы CodeIgniter после обновления до PHP 7.3 - PullRequest
1 голос
/ 24 апреля 2019

Я обновил свой PHP до версии 7.3.4 для моей установки CodeIgniter 3.1.10.После этого я заметил, что некоторые части моего сайта больше не работают, как раньше (с PHP 5.6).

Один из случаев использования, когда я печатаю неверный URL-адрес, например:

www.abc.com / nl-be / antwerpen / url-it-is-a-bad-url

Обычно это идет на мою страницу 404, но сейчас я впервые получилследующая ошибка:

Message: Call to a member function helper() on null

Filename: D:\wamp\www\codeigniter\application\hooks\LanguageLoader.php

Код:

class LanguageLoader
{
    function initialize() {
        $ci =& get_instance();
        $ci->load->helper('language');

        $site_lang = $ci->session->userdata('site_lang');
        if ($site_lang) {
            $ci->lang->load('message',$ci->session->userdata('site_lang'));
        } else {
            $ci->lang->load('message',$ci->session->userdata('site_lang'));
        }
    }
}

Мне удалось найти способ обойти эту проблему, используя приведенный ниже код (Это правильно?):

class LanguageLoader
{
    function initialize() {
        $CI =& get_instance();
        if ($CI === null) {
            new CI_Controller();
            $CI =& get_instance();
        }
        $CI->load->helper('language');

        $site_lang = $CI->session->userdata('site_lang');
        if ($site_lang) {
            $CI->lang->load('message',$CI->session->userdata('site_lang'));
        } else {
            $CI->lang->load('message',$CI->session->userdata('site_lang'));
        }
    }
}

После проверки значения $ CI, на этот раз оно не будет нулевым, но будет заполнено. В этот момент после перехода по тому же ошибочному URL я получаю следующее сообщение об ошибке:

Message: call_user_func_array() expects parameter 1 to be a valid callback, class 'Error' does not have a method 'my404'

Filename: core/CodeIgniter.php

Код в CodeIgniter.php в этой строке содержит:

call_user_func_array(array(&$CI, $method), $params);

Ошибка особенно странная, так как у меня есть метод my404 в моем классе ошибок:

class Error extends My_Controller {
    public function my404() {
        //Code to show my 404 template
    }
}

РЕДАКТИРОВАТЬ: мой URL выглядит как www.<sitename>.com/<languagesegment>/<optionalcityname>/<pathcontroller&function>

Если в URL указано полное имя, весь сайтмаркируется в цветах городов, логотипах и т. д. Если он не указан, появляется «нормальный» сайт.

При переходе на «нормальный» сайт моя страница 404 отображается правильно.

1 Ответ

2 голосов
/ 24 апреля 2019

Я никогда не использовал CodeIgniter, но быстрый взгляд на документацию показывает, что, по непонятным причинам, они не используют пространства имен. Это довольно неслыханно для современной кодовой базы, и вы узнаете почему.

PHP 7.0 представил класс Error в качестве базового класса для всех внутренних ошибок PHP. Поскольку ваш код не является пространством имен, вы пытаетесь перезаписать этот встроенный класс. Если вы посмотрите на свой журнал ошибок, вы увидите что-то вроде этого:

PHP Fatal error:  Cannot declare class Error, because the name is already in use in...

Переименуйте ваш Error класс в нечто, не являющееся зарезервированным именем , и оно должно решить эту проблему.

...