Automatyczne ładowanie plików
Tworząc bardziej zaawansowany skrypt w PHP wcześniej, czy później natrafimy na problem ładowania plików z odpowiednimi klasami. Najprościej byłoby dołączyć wszystkie pliki na samym początku, jednak jest to wysoce nieefektywne i czasochłonne. Począwszy od wersji 5, PHP dostarcza narzędzia ułatwiające rozwiązywanie tego typu problemów.
autoload
Jednym z rozwiązań jest użycie metody magicznej __autoload(), która pobiera jeden parametr – nazwę klasy. Funkcja ta jest wywoływana za każdym razem, gdy tworzymy obiekt klasy.
<?php define('PATH','./sciezkaDoPlikow/'); function __autoload($nazwaKlasy) { if (file_exists(PATH.$nazwaKlasy.'.php')) { require PATH.$nazwaKlasy.'.php'); } else { echo "Klasa nie istnieje"; } } $ob = new jakasKlasa(); ?>
W 2 linijce kodu deklarujemy stałą PATH, która zawiera ścieżkę do pliku. Wewnątrz funkcji znajduje się instrukcja warunkowa sprawdzająca czy istnieje plik o zadanej ścieżce. Jeżeli warunek zostanie spełniony następuje dołączenie pliku za pomocą funkcji require. W przeciwnym wypadku zostanie wyświetlony komunikat „Klasa nie istnieje”. W ostatniej linijce tworzymy obiekt klasy jakasKlasa – w tym momencie zostaje wywołana funkcja __autoload z argumentem jakasKlasa.
Funkcja __autoload() ma jedną zasadniczą wadę – może być zdefiniowana tylko raz. Jest to poważne ograniczenie, szczególnie uciążliwe w przypadku tworzenia większych aplikacji, gdzie konieczne jest załadowanie plików z kilku różnych lokalizacji. Do rozwiązania tego problemu możemy użyć spl_autoload_register.
spl_autoload_register
spl_autoload_register jest nowym mechanizmem, który został dołączony w PHP 5.1, a począwszy od PHP 5.3 włączony jest domyślnie.
<?php define('PATH','./sciezkaDoPlikow/'); define('PATH2','./sciezkaDoPlikow/2'); function autoload1($nazwaKlasy) { if (file_exists(PATH.$nazwaKlasy.'.php'))) { require PATH.$nazwaKlasy.'.php'); } else { echo "Klasa nie istnieje"; } } function autoload2($nazwaKlasy) { if (file_exists(PATH2.$nazwaKlasy.'.php'))) { require PATH2.$nazwaKlasy.'.php'); } else { echo "Klasa nie istnieje"; } } spl_autoload_register('autoload1'); spl_autoload_register('autoload2'); $ob = new jakasKlasa(); ?>
W tym przypadku mamy dwie funkcje ładujące, które ładują pliki z różnych lokalizacji. Za pomocą funkcji spl_autoload_register() rejestrujemy dane funkcje jako loadery. W trakcie tworzenia obiektu zostają one kolejno wywoływane (w takiej kolejności, w jakiej zostały zarejestrowane), aż do momentu znalezienia odpowiedniego pliku.
Jest to o wiele wygodniejsze rozwiązanie, gdyż możemy stworzyć nieograniczoną ilość funkcji ładujących.
Można również stworzyć klasę Loader:
<?php /* * @author Łukasz Socha <kontakt@lukasz-socha.pl> * @version: 1.0 * @license http://www.gnu.org/copyleft/lesser.html */ /** * This class loads other files with class. */ class Loader { protected $_name; protected $_dir; protected $_valid=false; public function __construct($name, $dir) { $this->_valid=true; $this->_name=$name; $this->_dir=$dir; } /* * It loads a file with class. * * @param string $className * @return bool */ public function load($className) { if(@include($this->_dir.$className.'.php')) { return true; } else { return false; } } /* * It registers the function loader. */ public function register() { if($this->_valid) { spl_autoload_register(array($this, 'load')); $this->_valid=false; } } } ?>