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í.

  1. <?
  2. include("DirectoryIteratorFilter.php");
  3. include("FileIteratorFilter.php");
  4. include("RecursiveDirectoryIteratorFilter.php");
  5. include("RecursiveFileIteratorFilter.php");
  6. $it=new RecursiveFileIteratorFilter(dirname(__FILE__), "^clanek");
  7. foreach ($it as $itFile) {
  8. echo $itFile->getPath()." - ".$itFile->getFileName()."<br/>";
  9. }
  10. ?>

A teď s použitím funkce __autoload().

  1. <?
  2. function __autoload($class) {
  3. require_once($class.".php");
  4. }
  5. $it=new RecursiveFileIteratorFilter(dirname(__FILE__), ".jpg$|.gif$|.png$");
  6. ?>

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.

  1. <?
  2. function __autoload($class) {
  3. $path = array(
  4. "/Common/".$class.".php",
  5. "/FileSystem/".$class."class.php"
  6. );
  7. foreach ($path as $v) {
  8. if (file_exists($v)) {
  9. include_once ($v);
  10. break;
  11. }
  12. }
  13. }
  14. $it=new RecursiveFileIteratorFilter(dirname(__FILE__), ".jpg$|.gif$|.png$");
  15. ?>

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 k článku RSS Komentáře   Add to Google
06.10.2008 21:14 | Anonym (v6ak) | __autoload nedoporučuji, jde to i jinak...

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

07.10.2008 08:19 | Administrátor | Re: __autoload nedoporučuji, jde to i jinak...

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.

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>