0

我在应用程序/核心中有一个名为 prefix_Exceptions.php 的异常,具有相同的类名。我尝试从控制器抛出这个异常,我得到:

Fatal error: Class 'prefix_Exceptions' not found in user_controller.php

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.";
    }
}

并在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";
    }
}

哦,我的前缀设置为prefix_

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

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

4

1 回答 1

6

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

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

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

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

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

编辑:

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

$foo = load_class('Exceptions', 'core', $this->config->item('subclass_prefix'))

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

$foo->someMethodName();
于 2013-10-04T17:08:08.907 回答