升级到PHP 7.3后的CodeIgniter问题

我已将我的PHP升级到适用于CodeIgniter 3.1.10的7.3.4版。此后,我注意到我的网站的某些部分不再能够像以前那样工作了(使用PHP 5.6)。


用例之一是当我输入错误的URL时,如下所示:


www.abc.com/nl-be/antwerpen/this-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的值之后,这次它将不为null,但将被填充。这时,在转到相同的错误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);

由于我在Error类中有一个my404方法,因此该错误特别奇怪:


class Error extends My_Controller {

    public function my404() {

        //Code to show my 404 template

    }

}

编辑:我的网址看起来像 www.<sitename>.com/<languagesegment>/<optionalcityname>/<pathcontroller&function>


如果在URL中填写了optionalcityname,则整个网站都以城市的颜色和徽标等为品牌标记。如果忽略该网站,则会出现“普通”网站。


转到“正常”网站时,我的404页面会正确显示。


翻过高山走不出你
浏览 222回答 1
1回答

湖上湖

我从未使用过CodeIgniter,但快速浏览文档似乎表明,它们莫名其妙地不使用名称空间。对于现代代码库,这是闻所未闻的,您正在学习为什么。PHP 7.0将该Error类作为所有内部PHP错误的基类引入。由于您的代码未命名空间,因此您试图覆盖此内置类。如果查看错误日志,将会看到以下内容:PHP&nbsp;Fatal&nbsp;error:&nbsp;&nbsp;Cannot&nbsp;declare&nbsp;class&nbsp;Error,&nbsp;because&nbsp;the&nbsp;name&nbsp;is&nbsp;already&nbsp;in&nbsp;use&nbsp;in...将您的Error班级重命名为非保留名,这可以使您克服此问题。
打开App,查看更多内容
随时随地看视频慕课网APP