Создание библиотек
Когда мы используем термин "библиотеки", обычно мы ссылаемся на классы, которые находятся в директории libraries и описаны как классы в этом руководстве. Однако сейчас мы расскажем, как создавать ваши собственные библиотеки в вашей директории application/libraries, представляющие ваши собственные локальные ресурсы, в отличие от глобальных ресурсов фреймворка.
Как дополнительный бонус, CodeIgniter позволяет расширять родные классы, если вы просто хотите добавить некотрую функциональность в существующие библиотеки. Или вы можете заменить родные библиотеки, просто поместив файлы с идентичными именами в вашу директорию application/libraries.
Итого:
- Вы можете создавать совершенно новые библиотеки.
- Вы можете расширять родные библиотеки.
- Вы можете заменять родные библиотеки.
На странице ниже в деталях объясняются эти три концепции.
Примечание: Классы базы данных не могут быть расширены или заменены вашими собственными классами.
Хранение
Ваши библиотечные классы должны находится внутри вашей директории application/libraries, так как именно там CodeIgntiter будет искать их перед тем, когда они будут инициализироваться.
Соглашение о наименовании
- Имена файлов должны начинаться с большой буквы. Например: Myclass.php
- Декларации классов должны начинаться с большой буквы. Например: class Myclass
- Имена классов и имена файлов должны совпадать.
Файл класса
Классы должны соответствовать этому прототипу (примечание: мы используем имя Someclass просто в качестве примера):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
function some_function()
{
}
}
?>
Использование вашего класса
Из любой функции ваших Контроллеров вы можете инициализировать собственный класс, используя стандартное:
$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 {
function __construct($params)
{
// Do something with $params
}
}
?>
Вы также можете передавать параметры, сохраненные в конфигурационном файле. Просто создайте конфигурационный файл, названный идентично файлу класса, и сохраните в вашей директории application/config/. Обратите внимание, что если вы передадите параметры в вызывающей функции, как показано выше, данные конфигурационного файла будут недоступны.
Использование ресурсов CodeIgniter в вашей библиотеке
Для того, чтобы получить доступ к родным ресурсам CodeIgntier из вашей библиотеки, используйте функцию get_instance(). Эта функция вернет суперобъект CodeIgniter.
Обычно из функций вашего контроллера вы можете вызвать любую доступную функцию CodeIgniter, используя конструкцию $this:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.
$this, однако, работает только в контроллерах и отображениях. Если вы хотите использовать классы CodeIgniter внутри вашего собственного класса, вы можете сделать это, как показано ниже:
Во первых, присвойте суперобъект CodeIgniter переменной:
$CI =& get_instance();
После присвоения, используйте эту переменную вместо $this:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.
Примечание: Обратите внимание, что результат функции get_instance() передается по ссылке:
$CI =& get_instance();
Это очень важно.
Передача по ссылке позволяет вам использовать оригинальный суперобъект CodeIgniter, а не создавать его копию.
Замена родных библиотек вашими версиями
Это просто, если вы назовете ваш класс идентично имени родной библиотеки 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 {
function __construct()
{
parent::__construct();
}
}
Загрузка вашего подкласса
Для того, чтобы загрузить ваш подкласс, используйте обычный синтаксис. НЕ включайте префикс. Например, чтобы загрузить пример выше, который расширяет класс Email, используйте:
$this->load->library('email');
Загруженный класс будете использовать так же, как и обычно — через переменную класса, который вы расширили. В случае с классом Email все вызовы будут такими:
$this->email->some_function();
Установка вашего собственного префикса
Для того, чтобы установить собственный префикс подклассов, откройте ваш файл application/config/config.php и найдите этот элемент:
$config['subclass_prefix'] = 'MY_';
Пожалуйста, обратите внимание на то, что все родные библиотеки CodeIgniter называются с префиксом CI_, поэтому НЕ используйте этот префикс.