CodeIgniter为什么不能在application/core中自动加载我的Exceptions文件?

Nob*_*ift 0 php codeigniter exception include classnotfound

我在application/core中有一个例外,名为prefix_Exceptions.php,具有相同的类名.我尝试从控制器抛出此异常,我得到:

Fatal error: Class 'prefix_Exceptions' not found in user_controller.php
Run Code Online (Sandbox Code Playgroud)

application/core/prefix_Exceptions.php:

<?php
class prefix_Exceptions extends CI_Exceptions {
    public function __construct() {
        parent::__construct();
    }

    public function test() {
        echo "This is a test.";
    }
}
Run Code Online (Sandbox Code Playgroud)

并在application/controllers/user_controller.php:

<?php
class User_Controller extends CI_Controller {
    public function view($id = '0') {
        $this->load->model('user_model');
        $u = $this->user_model->getUser($id);

        if (!isset($u)) {
            $this->exceptions->test(); // ???
        }
        echo "Test: $u";
    }
}
Run Code Online (Sandbox Code Playgroud)

哦,我的前缀设置为prefix_:

$config['subclass_prefix'] = 'prefix_';
Run Code Online (Sandbox Code Playgroud)

我已经阅读了关于这个问题的十几个线程,并且它们都没有修复我的异常,因此它可以被控制器抛出.

Mar*_*ark 6

您的代码无法正常工作的主要原因是(如错误消息所示):您prefix_invalid_user.php的代码永远不会被加载.CI不知道加载此文件,因为您没有遵循所需的文件命名方案.

如果要扩展内置类,则必须使用相同的类名,除非您将前缀更改CI_MY_(或在配置中设置的任何前缀).

要扩展类,CI_Exceptions您必须将其命名MY_Exceptions并保存该php文件/application/core/MY_Exceptions.php.然后,只有这样,CI才会为您自动加载它.

但是,您还应该知道CI的异常类实际上不是用于抛出异常(名称具有误导性,但CI_Exceptions处理错误报告).正如您在/system/core/Exceptions.php文件中看到的那样,CI_Exceptions该类不会扩展PHP的本机Exceptions类,这是创建自定义可抛出异常所必需的.

如果你想要自定义的throwable异常,你必须为它们创建自己的包装器,并将它作为库加载/自动加载.

编辑:

根据OP的要求,我正在添加另一半解决方案,即从CI的内部简单地获取类对象.为此,我们可以使用load_class函数,如果已经实例化它将返回我们的类对象,如果没有,它将实例化并返回它.

$foo = load_class('Exceptions', 'core', $this->config->item('subclass_prefix'))
Run Code Online (Sandbox Code Playgroud)

然后我们可以访问自定义Exceptions类的方法,如下所示:

$foo->someMethodName();
Run Code Online (Sandbox Code Playgroud)