создавая основной класс, который расширяет другой ключевой класс codeigniter

class Settings extends USER_Controller {...} class USER_Controller extends MY_Controller {...}//limit access to user and define some params and functions that is user depended class MY_Controller extends CI_Controller {...}//provide extra functionality accross all controllers 

хорошо, если я попытаюсь создать выше 3 класса, это не сработает.

но если я просто использую settings extends MY_Controller он будет работать нормально.

так есть способ, которым я могу поставить средний класс между моим контроллером и MY_Controller – базовым контроллером, который расширяет CI_Controller?

Как сказал @Minhaz Ahmed , проблема заключается в загрузке класса. Codeigniter загружает только класс с префиксом подкласса как в,

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php#L276

 if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) { require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; } 

Поэтому после некоторых раскопок я пришел с решением, использующим как hook, так и spl_​autoload_​register() для моего проекта без взлома CORE. Пожалуйста, следуйте инструкциям, чтобы достичь того, что находится в ВОПРОС .

  1. Включите перехваты в конфигурационном файле, если он еще не установлен.

  2. создайте крючок в приложении / config / hooks.php, как показано ниже.

    $hook['pre_system'] = array( 'class' => '', 'function' => 'autoload', 'filename' => 'autoload.php', 'filepath' => 'hooks', 'params' => '' );

  3. Создайте папку application/hooks папке application/hooks .

  4. внутри файла autoload.php ,

    function autoload() { spl_autoload_register(function($class) { if(strpos($class,'CI_') !== 0 && file_exists(APPPATH.'core/'.$class.EXT)) { require_once APPPATH . 'core/' . $class . EXT; } }); }

Вот и все.

Примечание. Здесь я использовал pre_system hook, а не pre_controller , поскольку codeigniter загружает классы базового контроллера между pre_system и pre_controller hooks.

Надеюсь это поможет. Если есть какие-либо проблемы с этим, пожалуйста, сделайте комментарии.

Поместите файл класса user_controller в конец MY_Controller.php

MY_Controller.php in / application / core /

 class MY_Controller extends CI_Controller {...} class USER_Controller extends MY_Controller {...} 

Теперь из вашего контроллера в папке ваших контроллеров вы можете расширить контроллер из USER_Controller:

  class Settings extends USER_Controller {...} 

Что сделало лучшую работу для CI 2.1.4:
приложение / ядро

создайте, например:
– base_controller (базовые инструкции, простирающиеся от ci_controller)
– admin_controller (расширение от базового контроллера и добавление инструкций аутентификации)

Затем используйте их в: application / controllers:
например:
пользователи класса расширяют admin_controller …

Вы можете использовать основное решение Фила, просто и просто.

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

Вы можете расширить класс так, как хотите, но проблема заключается в загрузке класса, вы должны включить свой USER_Controller свой класс Settings . Проблема заключается не в том, что проблема включает в себя файл, поэтому вам нужно найти способ включения второго класса.

См. http://www.php.net/manual/en/function.spl-autoload.php