Codeigniter扩展自定义模型会产生致命错误

时间:2013-06-21 09:58:17

标签: php codeigniter codeigniter-2

我在这上面看过几个不同的帖子,但似乎没有一个对我有效。

我有一个扩展CI_Model的类:

class Users_Model extends CI_Model {

public function __construct(){
    parent::__construct();
}

然后:

class Students_Model extends Users_Model {

private $_students;

public function __construct(){
      parent::__construct();

      $this->_students = $this->get_students();
}

然而,我接收到此错误消息:

PHP Fatal error:  Class 'Users_Model' not found in /Users/rosswilson/Localhost/thedrumrooms/dreamweaver/ci/application/models/students_model.php

我已经使用require_once将文件包含在扩展类中并且它可以正常工作。 这是最好的做法/正确的方法吗?

感谢。

4 个答案:

答案 0 :(得分:5)

CI中的标准做法是在名为application/core的{​​{1}}内创建基本模型,MY_Model.php取决于您的配置中定义的内容。

然后在MY_内部,您可以在该文件中定义许多可以在模型中扩展的类,基本上CodeIgniter的加载模型会在此路径和文件中查找已定义的类。

但是如果您想使用MY_Model.php,则必须使用require_once上定义的APPPATH (应用程序路径)。但是,您的自定义模型仍然必须扩展index.php,因为它使用CI模型的核心类,否则您的模型将无法工作。

ex CI_Model

添加说明:

谢谢@dean或者指出这一点。在require_once APPPATH.'/models/test.php';文件中, 必须 MY_Model.php,以扩展MY_Model class

答案 1 :(得分:1)

您是否确保在加载Students_model之前加载了Users_model? 你可以在autoload.php配置文件中执行此操作。

答案 2 :(得分:1)

解决方案是首先在派生类中包含父模型的定义文件。

Users_Model

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Users_Model extends CI_Model {

    public function __construct(){
echo("<hr><pre> L: ".__LINE__."  ::  :: F: ".__FILE__ . ' M: '.__METHOD__ .  ' '  . date('H:i:s').' (  ) '."</pre>\n"  . get_class($this)  );
    }

}

/* End of file Users_Model.php */
/* Location: ./application/models/Users_Model.php */

学生模型

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

include_once(APPPATH . 'models/Users_Model.php');

class Students_Model extends Users_Model {

private $_students;

    public function __construct(){
          parent::__construct();
echo("<hr><pre> L: ".__LINE__."  ::  :: F: ".__FILE__ . ' M: '.__METHOD__ .  ' '  . date('H:i:s').' (  ) '."</pre>\n" . get_class($this));
    }
}

/* End of file Students_Model.php */
/* Location: ./application/models/Students_Model.php */

测试用例

在某处包含

$this->load->model('Students_Model');

结果

 L: 9  ::  :: F: /www/application/models/Users_Model.php M: Users_Model::__construct 23:16:34 (  ) 
Students_Model
 L: 14  ::  :: F: /www/application/models/Students_Model.php M: Students_Model::__construct 23:16:34 (  ) 
Students_Model

屏幕截图

mind the twofold echo issued by parent and derived class

附录

为了在设计中获得更多结构,您可以决定将这两个类放入子文件夹models/people中。然后,您进行如下修改:

include_once(APPPATH . 'models/people/Users_Model.php');

$this->load->model('people/Students_Model');

答案 3 :(得分:0)

将文件users_model.php放在核心目录中。然后尝试将Users_Model继承到Students_Model。