PHP警告:call_user_func_array()回调无效,Error类无index方法求助
call_user_func_array()回调错误 我来帮你搞定这个部署后的PHP警告问题,这个错误的核心是CodeIgniter在执行call_user_func_array()时,试图调用Error类的index方法,但要么这个方法不存在,要么Error类本身就不是你自定义的控制器类。下面是具体的排查步骤:
检查路由配置是否指向了错误的控制器/方法
打开application/config/routes.php,查看默认路由或者相关自定义路由,比如$route['default_controller']是不是设置成了'error/index'。如果是,先确认你的项目里确实存在对应的Error控制器,并且里面有index方法。检查
Error控制器的定义与文件名
去application/controllers/目录下找Error.php文件,确认:- 文件名首字母是大写的(CodeIgniter要求控制器文件名首字母大写);
- 文件里的类名和文件名完全一致,比如:
class Error extends CI_Controller { public function index() { // 这里是你的方法逻辑 } } - 确保
index方法是public权限的,否则无法被路由调用。
重点排查PHP版本冲突问题
这是最容易忽略的点:PHP 7及以上版本中,Error是PHP内置的异常类!如果你的本地环境是PHP 5,自定义Error控制器没问题,但部署到PHP 7+的服务器上时,系统会优先识别内置的Error类,而这个内置类根本没有index方法,自然会报错。
解决办法:把你的自定义控制器改名,比如改成Errors或者MyError,然后更新路由配置里的对应项,同时把控制器文件名和类名也改成新的名称。检查服务器文件系统的大小写敏感性
本地如果是Windows系统,文件名大小写不敏感(比如error.php和Error.php都能识别),但服务器如果是Linux系统,文件名是严格区分大小写的。如果你的路由里写的是'Error/index',但控制器文件名是error.php,Linux服务器会找不到这个控制器,进而误调用内置的Error类,导致报错。确认控制器的加载路径
如果你的Error控制器在子目录下(比如application/controllers/errors/Error.php),路由里需要加上子目录前缀,比如$route['default_controller'] = 'errors/error/index';,否则系统会在根控制器目录里找,找不到就会出问题。
内容的提问来源于stack exchange,提问作者Krishnareddy Gorla

