Php 为什么可以';t CodeIgniter在application/core中自动加载我的异常文件?
我在application/core中有一个名为prefix_Exceptions.php的异常,它具有相同的类名。我尝试从控制器抛出此异常,得到: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 {
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文档中没有。非常感谢。