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 getScriptPath( string $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 |