CodeIgniter, руководство пользователя к версии 1.6.1


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

Когда мы используем термин «библиотеки», то, как правило, ссылаемся на классы, которые лежат в папке libraries и описаны в разделе «Классы» этого руководства. Однако сейчас мы будем говорить о том как создавать собственные классы в каталоге application/libraries чтобы сохранить разделение между локальными ресурсами и глобальными ресурсами фреймворка.

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

Кратко:

На этой странице объясняются детально эти три понятия.

Замечание: Класс Database не может быть расширен или заменен, а так же для PHP 4 нельзя заменять класс Loader. Все прочие классы можно свободно расширять/заменять.

Хранение

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

Правила именования

Файл класса

Классы должны следовать этому прототипу (Замечание: Мы называем класс 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 не может быть заменен на вашу версию.

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

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

Например, чтобы расширить родной класс 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_. Вам НЕЛЬЗЯ использовать его.