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š Autoloaderurequire_once SysConf_Path::getLibrary() . 'Jet/Autoloader/Cache/Backend/Files.php';
Detailněji si vše vysvětlíme dále.
Autoloader_Cache::init( new Autoloader_Cache_Backend_Files() );
- 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é.
namespace JetApplication;
use Jet\Autoloader_Loader;
use Jet\SysConf_Path;
class Autoloader_Jet extends Autoloader_Loader
{
public function getScriptPath( string $root_namespace, string $namespace, string $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 |