Codeigniter: использование load_class - PullRequest
0 голосов
/ 07 января 2012

Я пишу свой собственный класс журналирования для сохранения данных в БД. Когда я посмотрел, как работает CI, я заметил, что есть функция log_message(), которая обрабатывает регистрацию. В руководстве пользователя CI есть функция load_class, которую я никому не могу назначить.

1 Почему они помещают это в дополнительную функцию?

2 Из каких / куда загружаются файлы этой функции?

Надеюсь, есть парни из CI, как можно ответить: -)

1 Ответ

2 голосов
/ 08 января 2012

Краткий ответ: Вы можете написать собственный класс журнала для переопределения класса CI по умолчанию:

<?php
// this file is /application/libraries/MY_Log.php
class MY_Log extends CI_Log {
    public function write_log($level = 'error', $msg, $php_error = FALSE)
    {
        // Put your own logging function in here.
        // If you want it to still log to a file as usual, use this:
        parent::write_log($level, $msg, $php_error);
    }
}

Длинный ответ:

Функция load_class() по сути является одноэлементным загрузчиком.Если класс уже был загружен, верните предыдущий экземпляр;в противном случае загрузите его и создайте синглтон.Это очень важно в таких рамках, как CI.Вы должны знать, что каждый раз, когда вы вызываете, скажем, функцию базы данных, она применяет ее к одному и тому же объекту, а не создает экземпляр нового (который может стать очень грязным).По умолчанию все библиотеки CI работают таким образом.

Важное замечание: они значительно изменили эту функцию в версии 2.0.Раньше он загружался только из папки /libraries, но теперь он будет загружаться из /core или из того места, которое вы указали при вызове функции.

Вот процесс загрузки, скажем, класса Log (из вашего примера):

$_log =& load_class('Log');
$_log->write_log($level, $message, $php_error);

Это запускает следующие проверки в последовательности:

  1. Если класс Log уже существует, мы закончили.Верните синглтон.
  2. Если нет, сначала проверьте папку /system/libraries на наличие файла "Log.php"
  3. Если на шаге № 2 не было файла, теперь проверьте /application/libraries на наличиеФайл «MY_Log.php» (или любой другой префикс подкласса, заданный в вашей конфигурации)
  4. Если загружен класс CI по умолчанию (из папки /system), но у вас есть расширенный класс в /application, загрузите этот класс тоже.
  5. Верните новый экземпляр класса (ВАШИ, если он существует; в противном случае это класс CI_ *)

Мне на самом деле никогда не было необходимостииспользовать функцию load_class(), поскольку она позволяет расширение без проблем.Однако, хорошо знать, как это работает.

Итак, чтобы переопределить класс, сначала найдите, где находится оригинал (обычно /system/libraries или /system/core).Поместите свой файл расширения в соответствующую папку /application (это важно! Если он находится под /system/core, расширение ДОЛЖНО быть под /application/core).Добавьте к имени файла и имени класса префикс MY_ (или что-либо еще, что вы указали в своей конфигурации), и пусть он расширяет базовый класс CI_.

...