Получите помощь, поддержку и профессиональное общение в Клубе CodeIgniter

# CodeIgniter User Guide Version 2.1.0

Search User Guide

# Создание библиотек

Когда мы используем термин «библиотеки», обычно мы подразумеваем классы, находящиеся в директории `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_`, поэтому не используйте этот префикс.

### Поделиться

Переведено в компании Аринт.

# Спасибо!

Вы тоже можете оказать помощь проекту! Как это сделать?

## Помощь и поддержка

Вы можете задать вопросы и получить ответы и советы от гуру CodeIgniter и веб-разработки: вступайте в Клуб CodeIgniter