Как наследовать модель от другой модели в CodeIgniter

я использую codeigniter для своего проекта, и у меня есть эта модель класса, которую я называю Genesis, которая выглядит так:

class Genesis_model extends CI_Model {
    function __construct() {
        parent::__construct();
    }

    function get() {
        return 'human soul';
    }
}

и у меня есть другая модель, хранящаяся в том же каталоге, которая расширяет Genesis_model

class Human_model extends Genesis_model {
    function __construct() {
        parent::__construct();
    }

    function get_human() {
        return $this->get();
    }
}

Human_model используется контроллером Human

class Human extends CI_Controller {     
    function __construct(){
        parent::__construct();
        $this->load->model('human_model');
    }       

    function get_human() {
        $data['human'] = $this->human_model->get_human();
        $this->load->view('human/human_interface', $data);
    }
}

если я выполню код, он выдаст ошибку, указывающую на return $this->get(). он гласит: «Неустранимая ошибка: класс Genesis_model не найден в ...\application\models\human_model.php в строке 2».

я использую этот метод, потому что почти все мои модели имеют почти одинаковую структуру. Я собираю аналогичную функциональность в Genesis, в то время как другие модели служат только поставщиками данных, уникальных для таблиц, которые они представляют. это хорошо работает в моем asp.net (vb.net), но я не знаю, как это сделать в codeigniter.

есть ли способ для Human_model унаследовать Genesis_model. я не думаю, что мне разрешено использовать include('genesis_model.php'). я тоже не знаю, работает ли это.

заранее спасибо.


person dqiu    schedule 04.07.2011    source источник
comment
интересные ответы здесь stackoverflow.com/questions/46338/   -  person steve    schedule 04.07.2011


Ответы (5)


Поместите файл genesis_model.php в основной каталог.

person Alfonso Rubalcava    schedule 04.07.2011
comment
да. Вы можете создать столько расширений для своих моделей, сколько вам нужно, просто поместить их в /core/ и использовать по своему усмотрению. - person Alfonso Rubalcava; 05.07.2011
comment
Я просто переместил genesis_model.php в /core/ и переименовал имя файла и имя класса в MY_Controller.php и MY_Controller. но выполнение останавливается на $this-›get() в Human_model с ошибкой: Неустранимая ошибка: вызов неопределенного метода Human_model::get() в ..\application\models\human_model.php я что-то пропустил? - person dqiu; 05.07.2011

core/MY_Model хорош, если для ваших моделей есть только один важный суперкласс.

Если вы хотите наследовать не только модельный суперкласс, лучше изменить конфигурацию автозагрузки.

В application/config/autoload.php добавьте эту строку:

    $autoload['model'] = array('genesis_model');
person Josh    schedule 30.11.2013
comment
Я считаю, что этот ответ именно то, что хочет автор вопроса. У меня уже есть MY_Model, и я хочу расширить эту MY_Model в ME_Model. Поместив ME_Model в application/models и автоматически загрузив его, как было предложено выше, я могу достичь этой цели. - person Simeon Abolarinwa; 09.03.2014
comment
Какой каталог ищет автозагрузка? Я положил свой второй модельный класс в каталог ядра и поместил имя класса в автозагрузку, ошибка сказала, что класс не может быть найден. - person tingfungc; 22.04.2014
comment
@tingfungc Это загрузит любую доступную модель в ваше приложение, обычно в application/models/. - person Siphon; 13.03.2015
comment
Также вместо метода автозагрузки можно использовать $this->load->model('Genesis_model');, если вы ВСЕГДА загружаете расширенный Genesis_model перед загрузкой модели Human_model. Например, было бы лучше, если бы вы загружали две модели только в один и тот же конструктор библиотеки. - person Siphon; 13.03.2015

Измените свою модель Human_model на это:

include('genesis_model.php');
class Human_model extends Genesis_model {
    function __construct() {
        parent::__construct();
    }

    function get_human() {
        return parent::get();
    }
}

обратите внимание на функцию get_human и функцию include.

person Yasser Souri    schedule 04.07.2011

Вы должны включить Genesis_model в свой Human_model.php следующим образом:

include_once( APPPATH . 'folder/file' . EXT );

Или вы можете автоматически загрузить его в свой файл config/autoload.php, что я считаю глупым =)

person Community    schedule 04.07.2011

другое решение

<?php
$obj = &get_instance();
$obj->load->model('parentModel');
class childModel extends parentModel{
    public function __construct(){
        parent::__construct();
    }

    public function get(){
        return 'child';
    }
}
?>
person Diaconescu Doru    schedule 01.09.2014