Разработка собственных библиотек

 

Когда в данном руководстве используется термин "библиотека" то подразумевается класс расположенный в каталоге libraries и описанный в разделе _Справочник Классов_ данного руководства. Но в данном случае будет описан способ создания ваших собственных библиотек в каталоге application/libraries с целью разделения ваших локальных ресурсов и глобальных ресурсов фреймворка.

Кроме того, CodeIgniter позволяет вам наследовать и дополнять системные классы, если вам нужно дополнить или изменить функциональность существующей библиотеки. Либо вы можете полностью заменить системную библиотеку, разместив файл с идентичным названием в каталоге application/libraries. В целом,

  • вы можете создавать новые библиотеки;
  • вы можете наследовать и расширять системные библиотеки;
  • вы можете полностью заменять системные библиотеки своими.

Примечание: системная библиотека Database не может быть наследована или переопределена, кроме того нельзя наследовать или переопределять класс Loader в PHP4. Остальные системные библиотеки могут быть переопределены или наследованы.

Хранение библиотек

Ваши классы библиотек должны храниться в каталоге application/libraries, т.к. CodeIgniter будет проверять этот каталог при инициализации библиотек.

Соглашение об именах

  • Имена файлов должны начинаться с заглавной буквы. К примеру: Myclass.php
  • Имена классов должны начинаться с заглавной буквы. К примеру: class Myclass
  • Имя класса и имя файла должны совпадать.

Файл с классом библиотеки

Класс библиотеки должен быть основан на следующем простом шаблоне:

  1. <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Someclass {
  4.  
  5. function some_function()
  6. {
  7. }
  8. }
  9.  
  10. ?>

Примечание: Название Someclass используется исключительно в качестве примера.

Использование класса

Из любого из ваших контроллеров вы можете инициализировать класс библиотеки при помощи кода:

  1. $this->load->library('someclass');

Здесь someclass - имя файла без расширения '.php'. Вы можете передавать имя файла в нижнем регистре или с первой заглавной буквой.
После загрузки вы можете использовать ваш класс, указывая его имя в нижнем регистре:
  1. $this->someclass->some_function(); // Экземпляры класса всегда называются в нижнем регистре

Передача параметров при инициализации класса

При вызове функции загрузки вашего класса библиотеки вы можете передавать динамический список параметров для его инициализации в качестве второго параметра, и этот список будет передан конструктору вашего класса в качестве параметра:

  1. $params = array('type' => 'large', 'color' => 'red');
  2.  
  3. $this->load->library('Someclass', $params);

Если вы используете эту функциональность, конструктор вашего класса должен обрабатывать передаваемые параметры:
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Someclass {
  4.  
  5. function Someclass($params)
  6. {
  7. // Do something with $params
  8. }
  9. }
  10.  
  11. ?>


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

Использование ресурсов CodeIgniter в ваших классах

Чтобы использовать ресурсы CodeIgniter в классе библиотеки нужно воспользоваться функцией get_instance(). Эта функция возвращает супер-объект CodeIgniter.
Обычно в классах-контроллерах вы можете использовать ресурсы CodeIgniter при помощи констркуции $this:

  1. $this->load->helper('url');
  2. $this->load->library('session');
  3. $this->config->item('base_url');
  4. ....

Конструкция $this для доступа к ресурсам CodeIgniter работает только в контроллерах, моделях и представлениях. Если вам нужно использовать классы CodeIgniter из ваших классов вы можете сделать следующее:
1. Присвойте переменной объект CodeIgniter
  1. $CI =& get_instance();

После этого можно использовать эту переменную вместо $this:
  1. $CI =& get_instance();
  2.  
  3. $CI->load->helper('url');
  4. $CI->load->library('session');
  5. $CI->config->item('base_url');
  6. ...


Обратите внимание на то, что результат get_instance() передается по ссылке:
$CI =& get_instance();
ЭТО ОЧЕНЬ ВАЖНО. Присваивание по ссылке позволяет использовать исходный объект CodeIgniter вместо того, чтобы создавать его копию.

Кроме того, если вы используете PHP4, постарайтесь не использовать get_instance() из конструкторов классов. В PHP4 есть проблема со ссылкой на объект CodeIgniter из конструкторов приложения, т.к. он не существует пока класс полностью не инициализирован.

Заменяем оригинальные библиотеки

Достаточно просто назвать свой класс идентично системному классу CodeIgniter, и он будет использован вместо системного. Чтобы использовать эту функциональность нужно задавать имя файла и объявление класса идентично системному. К примеру, чтобы заменить исходный класс Email, вам понадобиться создать файл application/libraries/Email.php, и объявить в нем класс:

  1. class CI_Email {
  2.  
  3. }

Обратите внимание на то, что для имени класса используется префикс CI_.
Чтобы загрузить вашу библиотеку достаточно использовать стандартную функцию загрузки:
  1. $this->load->library('email');

В настоящее время класс Database не может быть переопределён.

Расширение базовых библиотек

Если вам необходимо только добавить функциональность к базовой библиотеке - не имеет смысла заменять всю ее функциональность и переписывать её. В этом случае разумнее будет просто расширить базовый класс библиотеки. Расширение класса аналогично его переопределению с небольшими отличиями:

  • Объявление класса должно указывать на расширение (наследование) базового класса
  • Имя вашего класса должно начинаться с префикса MY_ (Префикс может быть изменен, см. ниже).

К примеру, чтобы расширить базовый класс Email вам понадобиться создать файл application/libraries/MY_Email.php, и в нем сделать следующее объявление класса:

  1. class MY_Email extends CI_Email {
  2.  
  3. }

Примечание: Если для вашего класса необходим код конструктора, он должен содержать вызов конструктора предка:
  1. class MY_Email extends CI_Email {
  2.  
  3. function My_Email()
  4. {
  5. parent::CI_Email();
  6. }
  7. }

Загрузка вашего под-класса

Для того, чтобы загрузить ваш под-класс нужно использовать стандартный способ загрузки библиотек. НЕ ДОБАВЛЯЙТЕ префикс к имени класса при загрузке. К примеру, чтобы загрузить класс описанный выше, который наследует класс Email, нужно выполнить следующий код:

  1. $this->load->library('email');

После загрузки вы можете использовать методы загруженного класса тем же образом, что и методы класса который вы наследовали и дополняли. В случае с классом Email это будет выглядеть так:
  1. $this->email->some_function();

Установка другого префикса

Для того, чтобы установить другой префикс для под-классов, откройте файл application/config/config.php и найдите строку:

  1. $config['subclass_prefix'] = 'MY_';

Примечание: все базовые классы CodeIgniter имеют префикс CI_, поэтому не используйте этот префикс.

Отправить комментарий

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Allowed HTML tags: <a> <em> <b> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <h2> <h3> <h4> <table> <tr> <td> <th>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]". PHP source code can also be enclosed in <?php ... ?> or <% ... %>.

Подробнее о форматировании

CAPTCHA
Этот вопрос предназначен для того, чтобы отсеять ботов
12 + 5 =
Решите простой математический пример и введите результат. К примеру, для вопроса 1+3 нужно ввести 4

Вход в систему

Последние комментарии