post_ico4

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;
        }
    }
}
?>
Co sądzisz o wpisie?
BeżnadziejnySłabyŚredniDobryBardzo dobry (Brak ocen, bądź pierwszy!)
Loading...