【问题标题】:Why can't CodeIgniter autoload my Exceptions file in application/core?为什么 CodeIgniter 不能在应用程序/核心中自动加载我的异常文件?
【发布时间】:2013-10-04 16:06:39
【问题描述】:

我在应用程序/核心中有一个名为 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_';

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

【问题讨论】:

  • 我猜你是在 application/config/config.php 中添加前缀 $config['subclass_prefix'] = 'prefix_';,对吧?
  • 是的。我现在如何访问我的 Exceptions 类中的方法?

标签: php codeigniter exception include classnotfound


【解决方案1】:

您的代码不起作用的主要原因是(如错误消息所示):您的 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 类,这是创建自定义、可抛出异常所必需的。

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

编辑:

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

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

然后我们可以像这样访问我们自定义的异常类的方法:

$foo->someMethodName();

【讨论】:

  • 另外,根据您问题的第二部分,我不会再尝试抛出它了,但我仍然希望加载它。
  • 您将文件命名为 prefix_Exceptions.php 并将您的类命名为 prefix_Exceptions?
  • 现在是。如何访问 prefix_Exceptions.php 中的方法?
  • 首先获取prefix_Exceptions 类对象,方法是:$foo = load_class('Exceptions', 'core', $this-&gt;config-&gt;item('subclass_prefix'));。然后你可以拨打$foo-&gt;someMethod()
  • 成功了!您应该将 load_class 位放在您的答案中,因为这部分是我所缺少的,并且在 CodeIgniter 文档中没有。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2013-11-23
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多