Tworzenie bibliotek
Kiedy używamy terminu "biblioteki", odnosimy się do klas, które są zlokalizowane w folderze libraries, a w tym podręczniku widnieją w spisie jako "Opis klas". W tym rozdziale wyjaśnimy w jaki sposób zarządzać własnymi bibliotekami, które znajdują się w katalogu application/libraries i tymi dostarczanymi bezpośrednio przez system.
CodeIgniter pozwala na to, aby Twoje biblioteki rozszerzały natywne klasy - to na wypadek gdybyś chciał dodać do nich jakieś funkcjonalności. Możesz również całkowicie zastąpić natywną bibiotekę, poprzez umieszczenie pliku o identycznej nazwie jak ta biblioteka w folderze application/libraries.
Podsumowując:
- Możesz tworzyć całkowicie nowe bibioteki.
- Możesz rozszerzać natywne biblioteki.
- Możesz zastępować natywne biblioteki.
Ta strona szczegółowo omawia te trzy koncepcje.
Uwaga: Klasa bazy danych nie może być rozszerzana lub zastępowana Twoimi własnymi klasami. Wszystkie inne klasy można natomiast rozszerzać/zastępować.
Lokalizacja bibliotek
Twoje biblioteki powiny znajdować się w folderze application/libraries, ponieważ tam CodeIgniter będzie ich szukał w momencie ich inicjalizacji.
Konwencje nazewnictwa
- Nazwy plików muszą zaczynać się od dużej litery. Dla przykładu: Mojaklasa.php
- Deklaracje klas muszą zaczynać się od dużej litery. Dla przykładu: class Mojaklasa
- Nazwy klasy i pliku muszą być takie same.
Plik klasy
Klasy powinny mieć taką podstawową postać (Uwaga: Używamy nazwy Someclass tylko jako przykład):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
public function some_function()
{
}
}
/* End of file Someclass.php */
Używanie Twojej klasy
Z poziomu każdej funkcji kontrolera, możesz załadować klasę używając standardowej składni:
$this->load->library('someclass');
Gdzie someclass jest nazwą pliku, bez rozszerzenia .php. Możesz użyć nazwy pisanej z małej lub dużej litery. CodeIgniter nie zwraca na to uwagi.
Do raz załadowanej klasy możesz odwoływać się przy użyciu wersji zapisu z małymi literami:
$this->someclass->some_function(); // Instancje obiektów będą zawsze występować pod nazwami pisanymi małymi literami
Przypisywanie parametrów podczas inicjalizowania klasy
Do funkcji, która odpowiada za załadowanie biblioteki, możesz przypisać zmienne w postaci tablicy, do drugiego parametru. Spowoduje to, że zostaną one przypisane do konstruktora klasy:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);
Jeśli chcesz używać tej funkcjonalności, powinieneś wprowadzić zmiany w konstruktorze, aby był przygotowany na przyjęcie dodatkowych parametrów:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
public function __construct($params)
{
// Jakieś czynności ze zmienną $params
}
}
?>
Możesz również przypisać parametry, które znajdują się w pliku konfigurayjnym. Po prostu stwórz plik konfiguracyjny, który będzie miał taką samą nazwę pliku jak klasa i zachowaj go folderze application/config/. Zauważ, że jeśli przypiszesz dodatkowe parametry, jak opisaliśmy to powyżej, to opcja z plikiem konfuguracyjnym nie będzie dostępna.
Wykorzystanie zasobów CodeIgnitera w Twojej bibliotece
Aby mieć dostęp do natywnych zasobów CodeIgnitera w bibliotece, nalezy użyć funkcji get_instance(). Zwaraca ona super obiekt CodeIgnitera.
Normalnie z każdej funkcji kontrolera możesz wywołać każdą dostępną funkcję poprzez użycie składni $this:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
itd.
$this, działa jednak tylko w kontrolerach, modelach i widokach. Jeśli chciałbyś używać klas CodeIgnitera w swojej własnej klasie, możesz to zrobić w następujący sposób:
Najpierw, przypisz obiekt CodeIgnitera do zmiennej:
$CI =& get_instance();
Kiedy już przypiszesz obiekt do zmiennej, możesz używać tej zmiennej zamiast $this:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
itd.
Uwaga: Zauważ, że powyższa funkcja get_instance() została przypisana przez referencję:
$CI =& get_instance();
To bardzo ważne. Przypisanie za pomocą referencji pozwala na użycie oryginalnego obiektu CodeIgnitera, zamiast tworzenie jego kopii.
Zastępowanie natywnych bibiotek własną wersją
Nazwanie własnej klasy w ten sam sposób jak nazwa natywnej biblioteki, spowoduje, że CodeIgniter będzie używał Twojego pliku, zamiast wersji dostarczonej przez system. Aby skorzytać tej możliwości, musisz użyć nazwy pliku oraz deklaracji klasy, takiej, jaką ma natywna biblioteka. Dla przykładu, aby zastąpić natywną bibliotekę Email musisz stworzyć plik o nazwie application/libraries/Email.php i utworzyć następującą deklarację klasy:
class CI_Email {
}
Zauważ, że większość natywnych klas ma prefiks CI_.
Aby załadować bibliotekę, wystarczy użyć standardowej funkcji ładowania:
$this->load->library('email');
Uwaga: W tym momencie, klasa bazy danych nie może być zastąpiona własną wersją.
Rozszerzanie natywnych bibliotek
Jeśli wszystko czego potrzebujesz, to dodanie określonej funkcjonalności do istniejącej już klasy (być może jednej lub dwóch funkcji), to zastępowanie całej biblioteki może nie być najrozsądniejszym rozwiązaniem. W takim wypadku lepszym rozwiązaniem jest rozszerzenie biblioteki. Rozszerzenie klasy jest prawie identyczne jak jej zastępowanie, ale z kilkoma wyjątkami:
- Definicja klasy musi rozszerzać klasę rodzica.
- Twoja nowa nazwa klasy i pliku muszą posiadać prefiks MY_ (ten element można skonfigurować. Szczegóły poniżej.).
Dla przykładu, aby rozszerzyć natywną klasę Email, musisz stworzyć plik o nazwie application/libraries/MY_Email.php i zadeklarować klasę w ten sposób:
class MY_Email extends CI_Email {
}
Uwaga: Jeśli musisz użyć konstruktora w Twojej klasie, upewnij się, że rozszerzasz konstruktor rodzica:
class MY_Email extends CI_Email {
public function __construct()
{
parent::__construct();
}
}
Ładowanie Twojej sub-klasy
Aby załadować Twoją sub-klasę użyj standardowej skladni. NIE dołączaj prefiksu. Dla przykładu, aby załadować powyższy przykład, który rozszerza klasę Email, użyjemy:
$this->load->library('email');
Po załadowaniu, klasy możemy używać tak jak dotychczas:
$this->email->some_function();
Ustalanie własnego prefiksu
Aby ustawić swój własny prefiks dla sub-klasy, otwórz plik application/config/config.php i spójrz na zmienną:
$config['subclass_prefix'] = 'MY_';
Zauważ, że wszystkie natywne biblioteki CodeIgnitera mają prefiks CI_, tak więc NIE używaj tego ciągu jako własnego prefiksu.