PHP Jet Framework

rychle, jednoduše, přímo, bezpečně, efektivně
čeština
Jak začít Dokumentace Ke stažení Kontakt Diskuze / Fórum Blog
Dokumentace

Autoloader

Ano, prostředek pro automatické nahrávání tříd je již dávno běžný standard a tak tedy ani v PHP Jet nesmí chybět.
Co to umí?

  • Neexistuje žádná pevně daná struktura tříd. Přesněji řečeno Jet sám o sobě pevně dané uspořádání tříd má, ale do reálných projektů často bývá nutné nahrát knihovnu třetí strany. Jet Autoloader je udělaný tak, aby mohl nahrát cokoliv. Ostatně celý svět nelze nastrkat do jedné unifikované škatulky. Proto je důležitá flexibilita.
  • Dá se říct, že Autoloader je modulární (jako většina věcí v rámci Jet).
  • Tvorba vlastního loaderu je snadná.
  • Autoloader se nesnaží určitě všechny cesty všech tříd ihned, ale určování cest ke třídám a rozhraním probíhá postupně na vyžádání. Tak, aby i při studené cache nedošlo k zahájení nějakých náročných operací.
  • Obsahuje keš. Tedy již jednou zjištěnou cestu třídy to již nemusí zjišťovat.
  • Vše je co nejjednodušší a co nejrychlejší.

Inicializace

Inicializace Autoloaderu probíhá zde (pokud neurčíte jinak :-) ):

  • ~/application/Init/Autoloader.php
    Zde se provádí registrace jednotlivých loaderů (loader = viz dále) require_once SysConf_Path::getLibrary() . 'Jet/Autoloader.php';

    Autoloader::initialize();

    require 
    SysConf_Path::getApplication() . 'Autoloaders/Jet.php';
    Autoloader_Jet::register();

    require 
    SysConf_Path::getApplication() . 'Autoloaders/ApplicationClasses.php';
    Autoloader_ApplicationClasses::register();

    require 
    SysConf_Path::getApplication() . 'Autoloaders/ApplicationModules.php';
    Autoloader_ApplicationModules::register();
  • ~/application/Init/Cache/Autoloader.php
    Zde se nastavuje keš Autoloaderu require_once SysConf_Path::getLibrary() . 'Jet/Autoloader/Cache/Backend/Files.php'

    Autoloader_Cache::init( new Autoloader_Cache_Backend_Files() );
    Detailněji si vše vysvětlíme dále.
Vaší pozornosti určitě neušlo několik důležitých věcí:
  • Při inicializaci Autoloaderu je samozřejmě nutné používat konvenční require.
  • Pro učení cest je použito SysConf_Path.
  • Inicializační skript je sočástní aplikačního prostoru - tedy určitě jej můžete modifikovat jakkoliv potřebujete.

Loader

Loader je termín označující modul, který fakticky rozhodne o cestě k souboru obsahujícím požadovanou třídu (pokud je daná třída pro daný loader relevantní). Jedná se o instanci třídy, která dědí od třídy Jet\Autoloader_Loader. Více se dočtete zde.

Důležité je, že:

  • Loader řeší jen a pouze zda je schopen poskytnout cestu pro danou třídu a pokud ano, tak ji poskytne. Nic víc. O ostatní režii a např. o keš se stará hlavní třída.
  • Loadery jsou součástí aplikačního prostoru. Naleznete je v adresáři ~/application/Autoloaders/. Jsou přímo určené k tomu, aby si je vývojář modifikoval a doplňoval jak uzná za vhodné.
Pro úplnost a názornost ještě jako příklad jeden z loaderů: namespace JetApplication;

use 
Jet\Autoloader_Loader;
use 
Jet\SysConf_Path;

class 
Autoloader_Jet extends Autoloader_Loader
{
    public function 
getScriptPathstring $root_namespacestring $namespacestring $class_name ): bool|string
    
{
        if( 
$root_namespace != 'Jet' ) {
            return 
false;
        }

        
$class_name str_replace'_'DIRECTORY_SEPARATOR$class_name );

        return 
SysConf_Path::getLibrary() . 'Jet/' $class_name '.php';

    }
}

Keš

Smyslem keše Autoloaderu je zaznamenat při prvním zjišťování cestu ke skriptu obsahujícímu danou třídu a příště již nemuset volat loadery. Ušetří se tím stovky (ne-li tisíce) volání a veškeré s tím související režie. Keš je samozřejmě důležitá součást Autoloaderu.

V praxi se postupně tvoří mapa cest ke skriptům kde se jaká třída nalézá.

Důležité je, že postupně. V mapě tedy budou pouze ty třídy, které opravdu používáte (keš je tedy nejmenší možná = méně dat = méně starostí pro server). 

Po přidání nových tříd (nebo celé knihovny) není nutné keš devalidovat. Ta se jednoduše postupně doplní o nové záznamy.

V praxi vlastně není keš nutné devalidovat nikdy, pokud neuděláte něco opravdu zásadního, nepřesunete projekt do jiného adresáře a podobně.

Stejně jakou jsou jednotlivé Loadery moduly, tak je modulární i samotná keš Autoloaderu. To kam a v jaké podobě si Autoloader uloží svou keš je věc backendu. Jet již obsahuje a používá backend pro ukládání dat do souborů. Ale pokud potřebujete, můžete si udělat backend svůj. (Poznámka: Pevně věřím, že nikoho nenapadne dělat backend pro autoloader, který bude data ukládat třeba do relační databáze ... To není ta úplně správná cesta. Právě zde je nutná maximální jednoduchost.)

Přehled tříd

Třída Význam
Jet\Autoloader Hlavni třída. Drží seznam registrovaných loaderů a provádí samotné automatické nahrávání tříd. Rovněž pracuje s keší.
Jet\Autoloader_Loader Abstraktní třída definující Loader. Tedy každý Loader dědí od této třídy. 
Jet\Autoloader_Cache Hlavní třída pro práci s keší. Poskytuje potřebnou fasádu a drží intanci backendu.
Jet\Autoloader_Cache_Backend Rozhraní definující backend keše autoloaderu.
Jet\Autoloader_Cache_Backend_Files Výchozí backend keše. Ukládá data v podobě jednoho souboru do adresáře ~/application/data
Předchozí kapitola
Jet\Config_Exception
Další kapitola
Loader