#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.php3. Этот раздел автозагрузки не загружается автоматически. Это предварительная загрузка классов с помощью 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 доступно везде в вашем коде.