升级到 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 以外的名称,这样您就可以解决这个问题。
我已将 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 以外的名称,这样您就可以解决这个问题。