Automatyczne ładowanie klas

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

Automatyczne ładowanie klas to mechanizm języka PHP, który pozwala na automatyczne odnalezienie i załadowanie pliku PHP z wybraną klasą w momencie jej pierwszego użycia. Oparty jest na dostarczonej przez programistę funkcji, która na podstawie nazwy klasy ładuje odpowiedni plik. Po raz pierwszy pojawił się w PHP 5.0 pod postacią magicznej funkcji __autoload(). W późniejszych wersjach rozszerzenie SPL dostarczyło nową, bardziej elastyczną implementację.

Działanie

W PHP 5.0 programista mógł stworzyć funkcję __autoload(), która za argument przyjmowała nazwę klasy. Była ona automatycznie wywoływana w momencie odwołania się do nieistniejącej klasy:

<?php
function __autoload($className)
{
   require('./files/'.$className.'.php');
} // end __autoload();

$object = new someClass;

Rozwiązanie to miało jednak kilka poważnych wad:

  • w całym skrypcie mogła być najwyżej jedna ładowarka, co stwarzało problemy przy łączeniu ze sobą różnych bibliotek.
  • ładowarka musiała być napisana strukturalnie.

W PHP 5.1 rozszerzenie SPL wprowadziło nową, bardziej elastyczną implementację automatycznego ładowania klas. Wciąż musimy dostarczyć własną funkcję ładującą, lecz tym razem możemy ich zainstalować kilka, a ponadto mamy swobodę w wyborze jej nazwy. Do ładowania możemy także wykorzystać metodę obiektu:

<?php
function firstAutoloader($className)
{
    if(strpos($className, 'filter_') !== false)
    {
        require('./filters/'.$className.'.php');
        return true;
    }
    return false;
} // end firstAutoloader();

function secondAutoloader($className)
{
    if(strpos($className, 'core_') !== false)
    {
        require('./core/'.$className.'.php');
        return true;
    }
    return false;
} // end secondAutoloader();

spl_autoload_register('firstAutoloader');
spl_autoload_register('secondAutoloader');

$obj1 = new filter_foo();
$obj2 = new core_bar();

Zarejestrowane funkcje wykonywane są jedna po drugiej do momentu, gdy któraś z nich zwróci true, co jest sygnałem dla PHP, że udało się załadować plik z daną klasą.

Wydajność

Dzięki automatycznemu ładowaniu klasy ładowane są w sposób leniwy, a my mamy pewność, że PHP nigdy nie będzie ładować klasy, która aktualnie nie jest nam potrzebna. Z drugiej strony, wykonanie kodu funkcji ładującej i przetłumaczenie nazwy klasy także nie pozostaje bez wpływu na wydajność. Istotne jest, aby używana przez nas implementacja ładowania była jak najprostsza i jak najwydajniejsza.

Kilka porad:

  • używaj prostych, łatwych do przetworzenia konwencji dotyczących nazewnictwa klas,
  • nie używaj funkcji file_exists() wewnątrz kodu ładującego. Sprawdzenie istnienia pliku wykonywane jest i tak w instrukcji require, a każda operacja dyskowa jest bardzo kosztowna.
  • funkcja ładująca powinna decydować, czy jest w stanie obsłużyć daną klasę, wyłącznie na podstawie analizy jej nazwy.

Obsługa przestrzeni nazw

Automatyczne ładowanie współpracuje z mechanizmem przestrzeni nazw. Funkcja ładująca otrzymuje w pełni kwalifikowaną nazwę klasy, w której symbol \ pełni rolę separatora przestrzeni nazw.

Standardy

Automatyczne ładowanie klas jest obecnie powszechnie wykorzystywane. Do niedawna jednak każdy projekt używał własnych konwencji dotyczących nazewnictwa klas oraz strategii ładowania, co utrudniało łączenie ich ze sobą. W listopadzie 2009 roku grupa czołowych twórców największych projektów PHP opracowała uniwersalną konwencję nazewnictwa klas PSR-0, która jest obecnie wdrażana w coraz większej liczbie przedsięwzięć.

Odradzane jest obecnie tworzenie własnych, autorskich konwencji nazewnictwa klas. Projekt, który je wykorzystuje, jest nieprzenośny i ciężko połączyć go z innymi.

Zobacz także