Создание библиотек
Когда мы используем термин «библиотеки», обычно мы подразумеваем классы, находящиеся в директории libraries и описанные в Справке по классам этого руководства. Но сейчас мы расскажем, как вы можете создавать ваши собственные библиотеки в директории application/libraries, разделяя локальные ресурсы и глобальные ресурсы фреймворка.
Как дополнительный бонус, CodeIgniter разрешает вашим библиотекам расширять родные классы, если вы просто хотите добавить какую-то функциональность в существующую библиотеку. Также вы можете заменить родные библиотеки, просто положив новые с аналогичными именами в директорию application/libraries.
В итоге:
- Вы можете создавать полностью новые библиотеки;
- Вы можете расширять родные библиотеки;
- Вы можете заменять родные библиотеки.
Ниже мы детально раскроем эти три концепции.
Примечание: Класс БД не может быть расширен или заменен вашими собственными классами. Все другие классы могут быть заменены или расширены.
Хранение
Классы ваших библиотек должны находиться в директории application/libraries, так как именно там CodeIgniter будет искать их, чтобы инициализировать.
Соглашение об именовании
- Имена классов должны быть написаны с большой буквы. Например: Myclass.php
- Декларации классов должны начинаться с большой буквы. Например: class Myclass
- Имена классов и файлов должны совпадать.
Файл класса
Классы должны соответствовать этому прототипу (мы используем имя Someclass просто для примера):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
public function some_function()
{
}
}
/* End of file Someclass.php */
Использование вашего класса
В любой из ваших функций контроллеров вы можете инициализировать класс, используя стандартное:
$this->load->library('someclass');
Где someclass — это имя файла, без раширения ".php". Вы можете передать имя файла с большой буквы или с маленькой, это не имеет значения.
Загруженный класс доступен при использовании имени, написанного маленькими буквами:
$this->someclass->some_function(); // Инстанции объектов пишутся всегда с маленькой буквы
Передача параметров при инициализации вашего класса
В функцию, загружающей библиотеку, вы можете передать данные массивом во втором параметре, и они будут переданы конструктору класса:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);
Если вы используете эту опцию, вы должны сделать так, чтобы конструктор ожидал данные:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
public function __construct($params)
{
// Сделать что-то с $params
}
}
Вы также можете передавать параметры, хранящиеся в конфигурационном файле. Просто создайте конфигурационный файл с именем, идентичным имени файла класса, и сохраните его в вашей директории application/config/. Помните, что если вы передаете параметры динамически, как описано выше, конфигурационный файл не будет использован.
Использование ресурсов CodeIgniter в вашей библиотеке
Чтобы получить доступ к родным ресурсам CodeIgniter из вашей библиотеки, используйте функцию get_instance(). Эта функция возвращает суперобъект CodeIgniter.
Обычно из функций вашего контроллера вы можете вызвать любую функцию CodeIgniter, используя конструкцию $this:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
и т.д.
$this, однако, работает только в контроллерах, моделях или отображениях. Если вы хотите использовать классы CodeIgniter в ваших собственных классах, сделайте как показано ниже:
Во-первых, присвойте суперобъект CodeIgniter переменной:
$CI =& get_instance();
После того, как вы присвоили объект переменной, вы можете использовать ее вместо $this:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
и т.п.
Примечание:
Помните, что get_instance() следует передавать по ссылке:
$CI =& get_instance();
Это очень важно!
Передача по ссылке позволяет вам использовать оригинальный объект CodeIgniter, а
не создавать его копию.
Замена родных библиотек вашими версиями
Просто назовите ваш класс идентично родной библиотеке, и он будет использоваться вместо нее. Чтобы сделать это, вы должны именовать файл и декларацию класса в точности также, как и в родной библиотеке. Например, чтобы заменить родную библиотеку Email, создайте файл application/libraries/Email.php, и объявите в нем класс:
class CI_Email {
}
Заметьте, что имена большинства родных классов начинаются с CI_.
Чтобы загрузить вашу библиотеку, используйте стандартную функцию загрузки:
$this->load->library('email');
Примечание: В настоящее время классы БД не могут быть заменены вашими версиями.
Расширение родных библиотек
Если все, что вам нужно, это добавить некоторую функциональность в существующую библиотеку, добавить функцию или две — тогда излишним будет заменять целую библиотеку своей версией. В этом случае достаточно будет просто расширить класс. Расширение класса практически идентично замене, за несколькими исключениями:
- Декларация класса должна расширять родительский класс.
- Имя нового класса и имя файла должны начинаться с MY_ (этот элемент конфигурируется, смотрите ниже).
Например, чтобы расширить родной класс Email, создайте файл, называющийся application/libraries/MY_Email.php, и декларируйте в нем ваш класс:
class MY_Email extends CI_Email {
}
Примечание: если вам нужен конструктор, убедитесь в том, что он расширяет родительский конструктор:
class MY_Email extends CI_Email {
public function __construct()
{
parent::__construct();
}
}
Загрузка ваших подклассов
Чтобы загрузить ваш подкласс, используйте обычный синтаксис. Не включайте префикс. Например, чтобы загрузить пример выше, который расширяет класс Email, вы будете использовать:
$this->load->library('email');
После загрузки вы будете использовать переменную класса, как вы это обычно делаете. В случае с классом Email все вызовы будут использовать:
$this->email->some_function();
Установка вашего собственного префикса
Чтобы установить ваш собственный префикс подклассов, откройте ваш файл application/config/config.php и найдите в нем:
$config['subclass_prefix'] = 'MY_';
Пожалуйста обратите внимание, что называния всех родных библиотек CodeIgniter начинаются с префикса CI_, поэтому не используйте этот префикс.