升级到PHP 7.3后的CodeIgniter问题

时间:2019-04-24 16:33:41

标签: php codeigniter 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);

由于我在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页面会正确显示。

1 个答案:

答案 0 :(得分:2)

我从未使用过CodeIgniter,但快速浏览文档似乎表明,它们莫名其妙地不使用名称空间。对于现代代码库来说,这是闻所未闻的,您正在学习为什么。

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

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

将您的Error类重命名为非reserved name的类,这样可以使您克服这个问题。