Technologie i narzędzia: język PHP 5, Java, JavaScript, Python, system Zend Framework, Django, biblioteka jQuery, Smarty, platforma Eclipse, MySQL, SVN, CVS, UML, Firefox.
WebProgramming - wszystko o serwisach internetowych
O serwisach internetowych.
[zend] Bardziej funkcjonalne autoload.
Każdy programista PHP 5 zna i lubi magiczną funkcję __autoload(). Z jej dobroci korzysta oczywiście system Zend Framework, który według mnie bardzo ciekawie rozwiązał problem ładowania plików/klas PHP. Dla niewtajemniczonych napisze tylko, iż w/w system określa ścieżkę na podstawie nazwy klasy według wzoru: klasa Zend_Db_Select jest przekształcana na ścieżkę /Zend/Db/Select.php - naszym zadaniem jest tylko ustawić odpowiednio ścieżki przeszukiwań (include_path).
Nie o tym jednak chciałem pisać. Moim celem na dzisiejszy wieczór jest przedstawienie rozszerzenia klasy Zend_Loader umożliwiającą “dorzucanie” nowych bibliotek, które nie są dostosowane do systemu Zend Framework (czyli nazwy klas nie są w odpowiednim formacie), a chciałyby skorzystać z dobroci funkcji __autoload().
Od razu podpowiem, że bezpośrednie wykorzystanie magicznej funkcji (w konfiguracji domyślnej - innej w sumie nie próbowałem) nie działa. Nie rozpisując się już więcej podaje kod:
-
class Fasic_Loader extends Zend_Loader {
-
//
-
-
/** Dodaj nowa funkcje/metode do obslugi ladowania klas
-
*/
-
self::$_autoloads[] = $callback;
-
}
-
}
-
-
/** Przeciazenie metody
-
*/
-
foreach(self::$_autoloads as $auto) {
-
return true;
-
}
-
}
-
// Nie znalazlem, sprobuj standardowej metody
-
return parent::autoload($class);
-
}
-
}
Przed wykorzystaniem naszej nowiutkiej klasy musimy powiadomić system Zend Framework o naszych zamiarach:
-
// Musimy recznie dalaczyc klase, autoload jeszcze nie dziala
-
require_once(’sciezka/do/Fasic_Loader.php’);
-
// Zarejestruj autoload, obsluga za pomoca naszej klasy
-
Zend_Loader::registerAutoload(‘Fasic_Loader’);
A teraz korzystanie z owocu naszej pracy, czyli sposób wykorzystania w klasie kontrolera:
-
class Index_Controller extends Zend_Controller_Action {
-
public function indexAction() {
-
// tutaj kod wykorzystujacy nowa biblioteke
-
}
-
-
public function loadLibrary($className) {
-
// sprawdz, czy klasa jest z naszej biblioteki i dolacz ja jezeli tak.
-
return true; // true - klasa zostala zaladowana, false - szukaj dalej
-
}
-
}
Prawda, że proste?
Napisz komentarz