Loader
Jedná se o modul Autoloaderu, který pracuje takto:
- Určí zda je pro daný název třídy relevantní pro daný loader. Pokud ne, vrátí false a Autoloader dá příležitost dalšímu zaregistrovanému loaderu.
- Pokud je pro daný název třídy relevantní, pak sestaví cestu ke skriptu, který třídu obsahuje. To by měl provést co nejrychleji (s co nejnižší režií). Zjištěnou cestu pak vrátí jako návratovou hodnotu. Hlavní třída systému Autoloader se postará o zbytek procesu nahrání třídy. To již není věcí jednotlivého Loaderu - jeho úkolem je pouze vrátit cestu ke skriptu třídy.
Každý loader musí dědit od třídy Jet\Autoloader_Loader.
Příklad loaderu (loader knihovny Jet - samotného frameworku, 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 );
}
};
Existují dva základní druhy autoloaderů
Jsou dva základní druhý autoloaderů:
- Autoloadery knihoven
Každá knihovna (v adresáři ~/library/) může mít svůj autoloader ve skriptu JetAutoloader.php - jak je uvedeno v příkladu výše. Libovolnou knihovnu lze tedy snadno doplnit o její vlastní loader, který bude perfektně kooperovat se systémem.
(Cesty a názvy lze samozřejmě změnit systémovou konfigurací.)
- Autoloadery aplikace
V adresáři ~/application/Autoloaders/ (i zde platí možnost změnit vše pomocí systémové konfigurace) naleznete dva základní autoloadery pro nahrávání tříd vaší aplikace. Je tu autoloader obecných tříd aplikace (ApplicationClasses.php) a tříd aplikačních modulů (ApplicationModules.php).
Vám samozřejmě nic nebrání vytvořit si další autoloader přesně dle vašich potřeb.
Pro všechny tyto základní autoloadery platí, že v každém skriptu je vždy jeden loader, který je vracen jako instance anonymní třídy.
Vytvoření a registrace (libovolného) autoloaderu
Obecný systém autoloaderu sice nabízí metody pro nahrání autoloaderů knihoven a autoloaderů aplikačních tříd, ale platí, že je možné snadno vytvořit a registrovat jakýkoliv autoloader.
Jedinou podmínkou je, že autoloader musí dědit od abstraktní třídy Jet\Autoloader_Loader a implementovat metody getAutoloaderName (definuje název autoloaderu používaný například pro generování chybových hlášení) a getScriptPath (generuje název skriptu dané třídy - pokud je autoloader pro danou situaci relevantní).
Obecně lze autoloader vytvořit zaregistrovat takto:
Autoloader::register( new class extends Autoloader_Loader {
public const CLASSES_MAP = [
'MyNamespace\\Class1' => 'path/to/class1.php',
'MyNamespace\\Class2' => 'path/to/class2.php',
'MyNamespace\\Class3' => 'path/to/class3.php',
];
public function getAutoloaderName(): string
{
return 'my/SuperAutoloader';
}
public function getScriptPath( string $class_name ): bool|string
{
return static::CLASSES_MAP[$class_name] ?? false;
}
});