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)
我已经阅读了关于这个问题的十几个线程,并且它们都没有修复我的异常,因此它可以被控制器抛出.
您的代码无法正常工作的主要原因是(如错误消息所示):您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)