Nedocenitelná funkce __autoload v OOP
Kdo programuje v OOP se bez funkce __autoload neobejde. Namísto includování desítek knihoven, které třeba ani nebudou potřeba, stačí říci aplikaci, kde je najde.
Potřebu této funkce pocítíte už např. v článku Rekurzivní procházení adresářů s filtrem souborů. Funkcí oznámíme aplikaci, kde má hledat třídy, které chceme používat. Např. ve výše uvedeném článku, pokud chceme filtrovat rekurzivně adresáře, jen pro soubory musíme naincludovat 4 knihovny než můžeme použít jednořádkový zápis filtrování.
- <?
- include("DirectoryIteratorFilter.php");
- include("FileIteratorFilter.php");
- include("RecursiveDirectoryIteratorFilter.php");
- include("RecursiveFileIteratorFilter.php");
- $it=new RecursiveFileIteratorFilter(dirname(__FILE__), "^clanek");
- foreach ($it as $itFile) {
- echo $itFile->getPath()." - ".$itFile->getFileName()."<br/>";
- }
- ?>
A teď s použitím funkce __autoload().
- <?
- function __autoload($class) {
- require_once($class.".php");
- }
- $it=new RecursiveFileIteratorFilter(dirname(__FILE__), ".jpg$|.gif$|.png$");
- ?>
Soubory s knihovnami musí být pojmenované stejně jako název třídy. Ale funkci si můžete upravit dle svého pro použití i v prostředí, kde jsou knihovny strukturovány v adresářích nebo mají trochu odlišný název.
A jak to funguje? Při jakémkoli přístupu PHP k nějaké knihovně např. pokusem o vytvoření její instance nebo přístupem ke statickému objektu třídy, PHP zjistí, zda již knihovnu načetlo do paměti, pokud ne, volá funkci __autoload s parametrem názvu třídy.
- <?
- function __autoload($class) {
- $path = array(
- "/Common/".$class.".php",
- "/FileSystem/".$class."class.php"
- );
- foreach ($path as $v) {
- if (file_exists($v)) {
- include_once ($v);
- break;
- }
- }
- }
- $it=new RecursiveFileIteratorFilter(dirname(__FILE__), ".jpg$|.gif$|.png$");
- ?>
Jestli jste objektově orientovanému programování ještě nepřišli na chuť, zkuste tento článek o Objektově orientovaném myšlení.
komentáře
RSS Komentáře
Já ho doporučuji vřele, při nerozumném použití může být jakákoli zdrojem problémů, zatím mi vyhovuje. U tvého řešení, jestli jsem to správně pochopil, je nutné každou knihovnu někam linkovat? což znesnadňuje její použití v dalších projektech, její přenos, její nezávislost? a to se mi nelíbí, naopak s autoloadem jsem ještě problémy neměl, nějak si ten problém nedokážu představit, mám oddělený adresář, kde jsou jen knihovny a jen z tohoto adresáře se knihovny načítají. Takže, bych se toho rozhodně nebál.



… před časem jsem se o tom rozepsal na http://v6ak.profitux.cz/…autoload.php .