升级到 PHP 7.3 后的 CodeIgniter 问题

CodeIgniter problems after upgrading to PHP 7.3

我已将 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);

这个错误特别奇怪,因为我的错误中有一个 my404 方法 class:

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

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

如果在 URL 中填写可选的城市名称,则整个网站将以城市颜色和徽标等标记。如果省略,则显示 "normal" 网站。

访问 "normal" 站点时,我的 404 页面正确显示。

我从未使用过 CodeIgniter,但快速浏览文档似乎表明,令人费解的是,它们不使用名称空间。这对于现代代码库来说是闻所未闻的,您正在了解原因。

PHP 7.0 引入了 the Error class 作为所有内部 PHP 错误的基础 class。由于您的代码未命名空间,因此您试图覆盖此内置 class。如果您查看错误日志,您会看到类似这样的内容:

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

将您的 Error class 重命名为 reserved name 以外的名称,这样您就可以解决这个问题。