Как добавить функцию автозапуска в CodeIgniter?

#php #oop #codeigniter #autoload

#php #ооп #codeigniter #автозагрузка

Вопрос:

Я хотел бы иметь возможность использовать ООП и создавать новые объекты в своих контроллерах в CodeIgniter. Итак, мне нужно использовать автозагрузочную функцию:

 function __autoload( $classname )
{
    require_once("../records/$classname.php");
} 
  

Но как я могу добавить это в CodeIgniter?

Комментарии:

1. Вам следует дать ссылку на ваш другой вопрос, чтобы лучше выразить ваши потребности 😉

Ответ №1:

Вы можете добавить свой автопогрузчик выше в app/config/config.php . Я уже использовал подобную autoload функцию раньше в этом месте, и она работала довольно аккуратно.

 function __autoload($class)
{
    if (strpos($class, 'CI_') !== 0)
    {
        @include_once(APPPATH . 'core/' . $class . EXT);
    }
} 
  

Любезно предоставлено Филом Стердженом. Этот способ может быть более переносимым. core вероятно, это было бы records для вас; но все равно проверьте правильность ваших путей. Этот метод также предотвращает любое вмешательство в загрузку CI_ библиотек (случайно)

Комментарии:

1. Это работает в PHP 5.4, но вызывает ошибку в PHP 5.5. Кто-нибудь знает обходной путь?

2. @tabacitu Я использую ее с 5.6.7 и у меня нет проблем, используйте что-то вроде phpab для генерации вашей карты классов, а затем включите ее

Ответ №2:

руководство пользователя по автоматической загрузке ресурсов довольно четко описывает это.

Для автоматической загрузки ресурсов откройте application/config/autoload.php создайте файл и добавьте элемент, который вы хотите загрузить, в массив автозапуска. В этом файле вы найдете инструкции, соответствующие каждому типу элемента.

Комментарии:

1. Я попробовал это сейчас и создал файл loader.php и автоматически загрузил его как файл «config». Но похоже, что функция выполняется при загрузке, поэтому я получаю это сообщение об ошибке: Message: require_once(../records/CI_Exceptions.php): failed to open stream: No such file or directory Есть предложения?

2. вероятно, вам нужно сделать вашу функцию автозагрузки более «интеллектуальной», например заменить _ на / и сделать путь абсолютным, чтобы это сделало CI_Exceptions.php -> CI/Exceptions.php

3. Этот раздел автозагрузки не загружается автоматически. Это предварительная загрузка классов с помощью Codeigniter. Чего хотел OP, так это автоматической загрузки классов при попытке их создания, что и делает принятый ответ.

Ответ №3:

Я бы предложил использовать хуки, чтобы добавить эту функцию в ваш код.

Включите перехваты в вашем config/config.php

$config['enable_hooks'] = TRUE;

В вашем application/config/hooks.php добавьте новый хук в вызов «pre_system», который происходит в core/CodeIgniter.php перед запуском всей системы.

$hook['pre_system'] = массив(
 0 => массив ( 
 'function' => 'load_initial_functions', 
 'filename' => 'your_hooks.php ', 
 'filepath' => 'hooks'
 )
);

Затем в папке hooks создайте 2 файла:

Первое: application/hooks/your_functions.php и разместите вашу функцию __autoload и все другие функции, которые вы хотите, чтобы были доступны на этом этапе.

Второе: application/hooks/your_hooks.php и разместите этот код:

функция load_initial_functions()
{
 требуется один раз (APPPATH.'hooks/your_functions.php ');
}

Это сделает все ваши функции определенными в your_functions.php доступно везде в вашем коде.