O autoload słów kilka

Jerzy Biernacki
05.09.2015

Sytuacja 1
...i tego dnia stworzył 99 klasę, dodał ją do katalogu class/ i dopisał require_once 'class/Klasa.php'; do swojego pliku klasy.php...

Załóżmy, że mam własną aplikację internetową, w której używam wielu własnych klas. Do każdego pliku który użytkownik będzie otwierać w przeglądarce (index.php, pomoc.php, logowanie.php, etc.) dodaję instrukcję "require" do pliku klasy.php, w którym wykonuję "require" dla każdej klasy.
Oto moja struktura katalogów:

 

class/

  Autoryzacja.php

  Uzytkownik.php

  Szablony.php

  Walka.php

index.php

config.php

klasy.php



Wada takiego rozwiązania - nie potrzebnie ładujemy np. klasę "Walka" w pliku pomoc.php smile.gif

Sytuacja 2
...i tego dnia stworzył 101 klasę, dodał ją do katalogu class/ i dopisał require_once 'class/Klasa.php'; do swojego pliku w którym ją użyje...

Załóżmy, że mam własną aplikację internetową, w której używam wielu własnych klas. W każdym pliku w którym używam jakiejś klasy dodaję ją poprzez "require_once".
Tutaj jest lepiej, ale też istnieje pewna wada - gdy w jednym pliku używam 10 klas, muszę mieć na początku pliku 10 "require'ów".

Rozwiązanie
W PHP5 istnieje bardzo ciekawa funkcjonalność o nazwie "Autoloading". Umożliwia ona stworzenie własnej funkcji (__autoload), która będzie wykonywana przy odwołaniu do jakiejś klasy, która nie została zadeklarowana. Dzięki temu, możemy automatycznie ładować klasy tylko te, których użyjemy, bez N linijek "require '...';" w danym pliku lub ładowania klas, których normalnie nie potrzebujemy.

Przykład użycia __autoload:
W katalogu class/ mamy pliki:
Klasa1.php zawierający klasę Klasa1 z metodą metoda1()
Klasa2.php zawierający klasę Klasa2 z metodą metoda1Klasy2()
Klasa3.php zawierający klasę Klasa3 z metodami metoda1() oraz test()

KOD:

function __autoload($nazwa_klasy) { // w $nazwa_klasy otrzymujemy nazwę klasy (jak nazwa wskazuje;)) którą mamy załadować.
require_once 'class/'.$nazwa_klasy.'.php'; // ładujemy klasę.
// echo 'Ładuję klasę '.$nazwa_klasy.'
'; // możesz odkomentować, aby zobaczyć kiedy, jaka klasa jest ładowana
}

Klasa1::metoda1(); // Dla początkujących - wykonanie metody statycznej (uruchomienie funkcji, bez tworzenia instancji klasy)
$instancja = new Klasa2();
$instancja -> metoda1Klasy2();
Klasa3::test();
Klasa3::metoda1();

//Tutaj "wyskoczy" błąd, ponieważ plik 'class/Klasa5.php' nie istnieje.
Klasa5::asdf();
?>



Uwagi
- Autoloading nie jest dostępne w PHP o wersji niższej niż 5.
- Autoloading nie jest dostępne w PHP CLI
- Wyjątki rzucone przez funkcję __autoload nie mogą zostać przechwycone w bloku catch (powodują Fatal Error)
- Strona w manualu PHP o Autoload

 

 
 
Zgłoś swój pomysł na artykuł

Więcej w tym dziale Zobacz wszystkie