Php 为什么可以';t CodeIgniter在application/core中自动加载我的异常文件?

Php 为什么可以';t CodeIgniter在application/core中自动加载我的异常文件?,php,codeigniter,exception,include,classnotfound,Php,Codeigniter,Exception,Include,Classnotfound,我在application/core中有一个名为prefix_Exceptions.php的异常,它具有相同的类名。我尝试从控制器抛出此异常,得到: Fatal error: Class 'prefix_Exceptions' not found in user_controller.php 在application/core/prefix\u Exceptions.php中: <?php class prefix_Exceptions extends CI_Exceptions {

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

Fatal error: Class 'prefix_Exceptions' not found in user_controller.php
application/core/prefix\u Exceptions.php
中:

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

    public function test() {
        echo "This is a test.";
    }
}
<?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";
    }
}
哦,我的前缀设置为
前缀

$config['subclass_prefix'] = 'prefix_';

关于这个问题,我已经读了十几个线程,没有一个线程修复了我的异常,这样控制器就可以抛出它。

您的代码不工作的主要原因是(正如错误消息所示):您的
前缀\u invalid\u user.php
从未加载。CI不知道加载此文件,因为您没有遵循所需的文件命名方案

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

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

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

如果您想要自定义、可丢弃的异常,您必须为它们创建自己的包装,并将其作为库加载/自动加载

编辑:

根据OP的请求,我添加了解决方案的另一半,即从CI的内部获取类对象。为此,我们可以使用
load\u class
函数,如果类对象已实例化,它将返回该类对象,如果未实例化,它将实例化并返回该类对象

$foo = load_class('Exceptions', 'core', $this->config->item('subclass_prefix'))
然后我们可以访问自定义异常类的方法,如下所示:

$foo->someMethodName();

代码无法工作的主要原因是(正如错误消息所示):您的
前缀\u invalid\u user.php
从未加载。CI不知道加载此文件,因为您没有遵循所需的文件命名方案

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

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

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

如果您想要自定义、可丢弃的异常,您必须为它们创建自己的包装,并将其作为库加载/自动加载

编辑:

根据OP的请求,我添加了解决方案的另一半,即从CI的内部获取类对象。为此,我们可以使用
load\u class
函数,如果类对象已实例化,它将返回该类对象,如果未实例化,它将实例化并返回该类对象

$foo = load_class('Exceptions', 'core', $this->config->item('subclass_prefix'))
然后我们可以访问自定义异常类的方法,如下所示:

$foo->someMethodName();

我猜你是在前缀
$config['subclass_prefix']='prefix_'
application/config/config.php
中,对吗?是的。我现在如何访问Exceptions类中的方法?我猜您的前缀是
$config['subclass_prefix']='prefix_'
application/config/config.php
中,对吗?是的。我现在如何访问Exceptions类中的方法?另外,基于你问题的第二部分,我不再尝试抛出它,但我仍然希望加载它。你将文件命名为
prefix\u Exceptions.php
,并将类命名为
prefix\u Exceptions
?现在就是这样了。如何访问prefix_Exceptions.php中的方法?首先通过执行以下操作获取
prefix_Exceptions
类对象:
$foo=load_class('Exceptions','core',$this->config->item('subclass_prefix')。然后你可以调用
$foo->someMethod()
。它成功了!你应该在你的答案中加入load_类,因为这是我遗漏的部分内容,在CodeIgniter文档中没有。谢谢。另外,基于你问题的第二部分,我不再尝试抛出它,但我仍然希望加载它。你将文件命名为
前缀\u异常。php
,并将类命名为
前缀\u异常
?现在是了。如何访问prefix_Exceptions.php中的方法?首先通过执行以下操作获取
prefix_Exceptions
类对象:
$foo=load_class('Exceptions','core',$this->config->item('subclass_prefix')。然后你可以调用
$foo->someMethod()
。它成功了!你应该在你的答案中加入load_类,因为这是我遗漏的部分内容,在CodeIgniter文档中没有。非常感谢。