Создание библиотек
Когда мы используем термин «библиотеки», то, как правило, ссылаемся на классы, которые лежат в папке libraries и описаны в разделе «Классы» этого руководства. Однако сейчас мы будем говорить о том как создавать собственные классы в каталоге application/libraries чтобы сохранить разделение между локальными ресурсами и глобальными ресурсами фреймворка.
В качестве бонуса, CodeIgniter позволяет вам расширять родные классы фреймворка, если вам просто необходимо добавить какую-то функциональность. Или вы можете полностью заменить родную библиотеку, просто разместив свою с идентичным названием в папке application/libraries.
Кратко:
- Вы можете создавать совершенно новые библиотеки.
- Вы можете расширять функционал родных библиотек.
- Вы можете полностью заменять родную библиотеку.
На этой странице объясняются детально эти три понятия.
Замечание: Класс Database не может быть расширен или заменен, а так же для PHP 4 нельзя заменять класс Loader. Все прочие классы можно свободно расширять/заменять.
Хранение
Ваши библиотеки классов должны быть расположены в директории application/libraries, CodeIgniter будет искать их там во время инициализации.
Правила именования
- Имена файлов с большой буквы. Например: Myclass.php
- Имя класса с большой буквы. Например: class Myclass
- Имя файла и имя класса должны совпадать.
Файл класса
Классы должны следовать этому прототипу (Замечание: Мы называем класс Someclass только в качестве примера):
<?php if (!defined('BASEPATH')) exit('Нет доступа к скрипту');
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('Нет доступа к скрипту');
class Someclass {
function Someclass($params)
{
// Какие-то операции с $params
}
}
?>
Вы так же можете передавать параметры, хранящиеся в конфигурационном файле. Просто создайте файл с именем, аналогичным имени файла с классом и сохраните в вашей папке application/config/. Заметим, что если вы передаете параметры динамически, то конфигурационный файл будет недоступен.
Использование ресурсов CodeIgniter в вашей библиотеке
Для доступа к родным ресурсам CodeIgniter в вашей библиотеке используется функция get_instance(). Эта функция вернет супер-объект CodeIgniter.
При помощи этого вы сможете обращаться к любой родной функции при помощи конструкции $this:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
и т.п.
$this, однако, работает только в вашем контроллере, модели или отображении. Если вы хотите использовать родные классы CI внутри ваших собственных, то можете сделать это следующим образом:
Во первых присвоить указатель на родной объект переменной:
$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, а не создавать его копию.
Кроме того имейте ввиду: Если вы работаете с PHP 4, то лучше избегать вызова get_instance()
внутри вашего конструктора класса. PHP 4 имеет проблемы с созданием ссылок на супер-объект CI в контроллере, т.к. объекты не существуют до
тех пор, пока класс полностью не обработан.
Замена родных библиотек вашими версиями
Вам достаточно назвать собственный класс таким же именем, как и родной, и CI загрузит его, вместо родного. Например, чтобы заменить родной класс Email, вы можете создать файл application/libraries/Email.php и создать класс внутри него:
class CI_Email {
}
Заметим, что большинство родных классов имеют префикс CI_.
Для загрузки вашей библиотеки используйте родную функцию загрузки:
$this->load->library('email');
Замечание: На данный момент класс Database не может быть заменен на вашу версию.
Расширение родных библиотек
Если вам надо расширить функциональность библиотеки, возможно добавить одну-две функции, то вам стоит не переопределять всю библиотеку, а просто расширить ее функциональность. Расширение класса практически идентично его замене за парой исключений:
- Объявление класса должно расширять родительский класс.
- Новое имя класса должно начинаться с префикса MY_ (это можно настроить. Смотри ниже).
Например, чтобы расширить родной класс Email, вы должны создать файл application/libraries/MY_Email.php и объявить внутри класс:
class MY_Email extends CI_Email {
}
Замечание: Если вам в вашем классе необходимо использовать конструктор, то не забудьте вызвать в нем родительский конструктор:
class MY_Email extends CI_Email {
function My_Email()
{
parent::CI_Email();
}
}
Загрузка вашего подкласса
Для загрузки собственного подкласса, как правило, используется стандартный синтаксис. НЕ указывайте здесь ваш префикс. Так, например, для класса Email, который расширяет стандартный одноименный класс, вы должны использовать:
$this->load->library('email');
После загрузки класса, вы будете использовать переменные класса, как при обычном его расширении. В случае в описанным примером все вызовы будут иметь следующий синтаксис:
$this->email->some_function();
Установка собственного префикса
Для установки собственного подклассового префикса откройте файл application/config/config.php и напишите там следующее:
$config['subclass_prefix'] = 'MY_';
Пожалуйста учтите, что стандартным для CodeIgniter является префикс CI_. Вам НЕЛЬЗЯ использовать его.