4

我看过一些关于此的不同帖子,但似乎没有一个对我有用。

我有一个扩展 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

4 回答 4

5

CI 中的标准做法是在application/corenamed中创建一个基本模型MY_Model.phpMY_这取决于您的配置中定义的内容。

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

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

前任require_once APPPATH.'/models/test.php';

补充说明:

谢谢@dean 或指出这一点。在MY_Model.php文件内必须有一个MY_Model class扩展CI_Model.

于 2013-06-21T10:04:36.687 回答
1

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

于 2013-07-03T06:54:03.430 回答
1

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

用户_型号

<?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

截屏

注意父类和派生类发出的双重回声

附录

为了在您的设计中获得更多结构,您可能决定将这 2 个类放到一个子文件夹models/people中。然后修改如下:

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

$this->load->model('people/Students_Model');
于 2018-09-03T21:32:22.167 回答
0

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

于 2013-06-21T10:32:34.327 回答