CodeIgniter:"不能重新声明课程"

时间:2014-06-18 11:32:52

标签: php codeigniter classloader

不可否认,我的OOPHP有点摇摇欲坠,但我不知道这有什么不对。在我的一个控制器中,我包括一个工具单,与控制器一样,它扩展了基类CI_Controller类。这引发致命错误:

Fatal error: Cannot redeclare class Utils in {file path}\utils.php on line 88

控制器:

class Dashboard extends CI_Controller {

    public function __construct() {

        //call parent constructor
        parent::__construct();

        //load utils
        require 'application/helpers/utils.php'; //<-- utils loaded
        $this->utils = new Utils(); //<-- utils instantiated

        //load Dashboard model
        $this->utils->load->model('dashboard');

    }

    //etc...

}

utils.php中:

class Utils extends CI_Controller {

    //prep for forms (on join or login views)
    public function prep_form() {
        $this->load->helper('form');
        $this->load->library('form_validation');
        $this->form_validation->set_error_delimiters('<li>', '</li>');
    }

    //etc - more util methods

}

为什么我认为我重新声明Utils尽管只是调用它并仅实例化一次?奇怪的是,我有另一个控制器,对于网站的另一部分,具有相同的模式,它没有抱怨。

最后,我尝试将require指令移到控制器外部,并将其更改为require_once以防万一真正调用它两次,并且在这两种情况下页面都会挂起,最终解决没有源代码发送到浏览器。

提前致谢。

6 个答案:

答案 0 :(得分:2)

重命名

  

helpers / utils.php

  

助手/ utils.php中。

除了windows处理类名称以外的服务器应该与文件名匹配。

希望它对你有所帮助。

答案 1 :(得分:1)

使用$ this-&gt; load-&gt; helper()而不是require()

答案 2 :(得分:1)

你为什么不打电话:

$this->load->library('utils'); // needs to be stored in the libraries directory

而不是

require 'application/helpers/utils.php'; //<-- utils loaded
$this->utils = new Utils(); //<-- utils instantiated

答案 3 :(得分:1)

我不知道你为什么要把类从CI_Controller扩展到你的助手。辅助函数的助手(比如按键排序MySQL结果等)。也许你需要model

如果您需要帮助程序中的CodeIgniter功能,请使用get_instance()代替$this

function prep_form() {
    get_instance()->load->helper('form');
    get_instance()->load->library('form_validation');
    get_instance()->form_validation->set_error_delimiters('<li>', '</li>');
}

答案 4 :(得分:1)

尝试

require_once 'application/helpers/utils.php';

避免此错误。

答案 5 :(得分:0)

require 'application/helpers/utils.php'; //<-- utils loaded

这个可能被叫两次。您可以将Dashboard实例化两次,也可以将该文件再次包含在其他位置。