Autoloader

Automatické nahrávání tříd samozřejmě nesmí v PHP Jet chybět. Jedná se de facto o modulární systém velice jednoduchých loaderů, který zahrnuje i keš.

Princip je ten, že se do systému autoloaderu registrují jednotlivé moduly, které nedělají nic jiného než že určují cestu ke skriptu dané třídy - samozřejmě pokud je loader pro danou třídu relevantní. Nic víc modul řešit nemusí.

Nahrání skriptu, ověření existence třídy či rozhraní a také kešování mapy souborů a tříd již řeší hlavní komponenta systému.

Autoloader a jeho keš funguje na principu postupného sestavování mapy tříd za běhu aplikace.

Loader

Jak již bylo řečeno, tak loader je malý jednoduchý modul, který pro danou třídu určí cestu skript. Ukažme si příklad autoloaderu, tedy skript: ~/library/Jet/JetAutoloader.php

use Jet\Autoloader_Loader;
use 
Jet\SysConf_Path;

return new class extends 
Autoloader_Loader
{
    public function 
getAutoloaderName() : string
    
{
        return 
'library/Jet';
    }
    
    public function 
getScriptPathstring $class_name ): bool|string
    
{
        
        if(!
str_starts_with($class_name'Jet\\')) {
            return 
false;
        }
        
        return 
SysConf_Path::getLibrary() . $this->classNameToPath$class_name );
        
    }
};

O loaderech se dočtete víc v příslušné kapitole.

Zde si ale řekněme, že loadery se dělí na dvě základní skupiny: autoloadery knihoven a autoloadery aplikačních tříd. Ovšem můžete vytvořit jakýkoliv loader na cokoliv a ten jednoduše registrovat. Systém je tak flexibilní jak je potřeba.

Inicializace

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

namespace JetApplication;

use 
Jet\Autoloader;
use 
Jet\SysConf_Path;

require_once 
SysConf_Path::getLibrary() . 'Jet/Autoloader.php';

Autoloader::initialize();
Autoloader::registerLibraryAutoloaders();
Autoloader::registerApplicationAutoloaders();
Autoloader::initComposerAutoloader();

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.

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

Inicializace keše autoloaderu

Inicializace keše autoloaderu naleznete ve skriptu ~/application/Init/Cache/Autoloader.php.

Inicializace má tuto podobu:

require_once SysConf_Path::getLibrary() . 'Jet/Autoloader/Cache/Backend/Files.php'

Autoloader_Cache::init( new Autoloader_Cache_Backend_Files() );

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