Я столкнулся с проблемой, чувствительной к регистру, и я не могу обернуть ее вокруг.
Вот как выглядит моя файловая структура. Я только вхожу в каталоги, с которыми я работаю, но на самом деле я использую полную установку CI3.
/application .... /controllers/ application_controller.php /core/ MY_Controller.php Public_controller.php .... /models/ Application_model.php .... Вот как выглядит синтаксис определения класса:
/application/core/My_Controller.php
 class MY_Controller extends CI_Controller { function __construct() { parent::__construct(); } } 
/application/core/Public_Controller.php
 class Public_Controller extends MY_Controller { function __construct() { parent::__construct(); } // Application logic here... } 
/application/controllers/application_controller.php
 class Application_controller extends Public_Controller { public function __construct() { parent::__construct(); } // Application logic here... } 
Читая документы, я вижу, что я должен назвать свои классы чем-то вроде:
 Foo_Controller.php 
Тогда я всегда (думал), что определение класса должно совпадать с именем файла. Так:
 class Foo_Controller extends Bar_Controller { .... } 
Тогда я либо получаю ошибку 500, либо не получаю никаких ошибок, а белую страницу. Когда я работаю локально (mac), все работает отлично. На данный момент (используя синтаксис выше) я, по крайней мере, получаю страницу codeigniter 404 по умолчанию. При использовании
 error_log(__FILE__); 
  в верхней части каждого класса, все, что я получаю, это My_Controller.php 
Спасибо за любые предложения!
В журнале изменений Codeigniter говорится:
Изменено соглашение об именах файлов (имена файлов классов теперь должны быть Ucfirst и все остальное в нижнем регистре ).
Таким образом, вы должны иметь имя контроллеров и файлов.
Я сам не люблю новое соглашение о присвоении имен CI-2 в этом случае было лучше.
Заметка:
  Имя контроллера Public_Controller (C Public_Controller ) и имя файла Public_controller.php могут работать, но я предпочитаю, чтобы оба имени были одинаковыми, поэтому имя контроллера должно быть Public_controller . 
  Как сказал @ jagad89, ваше имя файла для application_controller.php должно быть таким, как указано в руководстве по обновлению codeigniter: «… должно быть названо как Ucfirst-like, или, другими словами, они должны начинаться с заглавной буквы».  поэтому Application_controller.php 
Значение всех ваших контроллеров, моделей, библиотек и драйверов ( NOT HELPERS ) должно быть названо таким образом, чтобы его можно было использовать внутри codeigniter.
Для единства ваше определение класса должно соответствовать имени файла, как вы сказали.
  Вы должны увидеть 500 ошибок в вашем журнале, по крайней мере на linux, в /var/log/apache2/error.log которые должны помочь в процессе отладки. 
  мое решение в / application / core / i создает MY_Loader.php (верхний регистр для MY_L) 
  Я создаю класс MY_Loader с копией оригинальной функции "model" 
  Я прокомментирую строку «$ model = ucfirst ($ model)»; 
Код /application/core/MY_Loader.php:
 класс MY_Loader расширяет CI_Loader
 {
     / * это копия функциональной модели класса CI_Loader из /system/core/Moader.php * /
     публичная функциональная модель ($ model, $ name = '', $ db_conn = FALSE)
     {
         if (empty ($ model))
         {
             return $ this;
         }
         elseif (is_array ($ model))
         {
             foreach ($ model as $ key => $ value)
             {
                 is_int ($ key)?  $ this-> model ($ value, '', $ db_conn): $ this-> model ($ key, $ value, $ db_conn);
             }
             return $ this;
         }
         $ path = '';
         // Является ли модель в подпапке?  Если это так, проанализируйте имя файла и путь.
         if (($ last_slash = strrpos ($ model, '/'))! == FALSE)
         {
             // Путь перед последней косой чертой
             $ path = substr ($ model, 0, ++ $ last_slash);
             // И название модели за ней
             $ model = substr ($ model, $ last_slash);
         }
         if (empty ($ name))
         {
             $ name = $ model;
         }
         if (in_array ($ name, $ this -> _ ci_models, TRUE))
         {
             return $ this;
         }
         $ CI = & get_instance ();
         if (isset ($ CI -> $ name))
         {
             throw new RuntimeException ('Имя модели, которое вы загружаете, - это имя ресурса, который уже используется:'. $ name);
         }
         if ($ db_conn! == FALSE &&! class_exists ('CI_DB', FALSE))
         {
             if ($ db_conn === TRUE)
             {
                 $ db_conn = '';
             }
             $ this-> database ($ db_conn, FALSE, TRUE);
         }
         // Примечание: весь код при этом условии был справедливым:
         //
         // load_class ('Model', 'core');
         //
         // Однако load_class () создает экземпляры классов
         // кэшировать их для последующего использования и
         // MY_Model от абстрактного класса и
         // В любом случае, под-оптимальным.
         if (! class_exists ('CI_Model', FALSE))
         {
             $ app_path = APPPATH.'core'.DIRECTORY_SEPARATOR;
             if (file_exists ($ app_path.'Model.php))
             {
                 require_once ($ app_path.'Model.php ');
                 if (! class_exists ('CI_Model', FALSE))
                 {
                     throw new RuntimeException ($ app_path. Model.php существует, но не объявляет класс CI_Model ");
                 }
             }
             elseif (! class_exists ('CI_Model', FALSE))
             {
                 require_once (BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php ');
             }
             $ class = config_item ('subclass_prefix'). 'Model';
             if (file_exists ($ app_path. $ class. '. php'))
             {
                 require_once ($ APP_PATH $ класса. 'PHP.');
                 if (! class_exists ($ class, FALSE))
                 {
                     throw new RuntimeException ($ app_path. $ class. ". php существует, но не объявляет класс". $ class);
                 }
             }
         }
         // ~ $ model = ucfirst ($ model); / * это строка, которую я комментирую * /
         if (! class_exists ($ model, FALSE))
         {
             foreach ($ this -> _ ci_model_paths как $ mod_path)
             {
                 if (! file_exists ($ mod_path.'models /'.$ путь. $ model. '. php'))
                 {
                     Продолжать;
                 }
                 require_once ($ mod_path.'models /'.$ путь $ модель.. 'PHP.');
                 if (! class_exists ($ model, FALSE))
                 {
                     throw new RuntimeException ($ mod_path. "models /".$ path. $ model.". php существует, но не объявляет класс ". $ model);
                 }
                 ломать;
             }
             if (! class_exists ($ model, FALSE))
             {
                 throw new RuntimeException ('Невозможно найти указанную модель:'. $ model);
             }
         }
         elseif (! is_subclass_of ($ model, 'CI_Model'))
         {
             throw new RuntimeException («Класс». $ model. «уже существует и не расширяет CI_Model»);
         }
         $ this -> _ ci_models [] = $ name;
         $ CI -> $ name = new $ model ();
         return $ this;
     }   
 }