Import tříd
Když píšete kód v PHP (a obecně v objektově orientovaném programování), často používáte třídy. Jak a proč je dostat do vašeho kódu, to si nyní vysvětlíme .
Proč se třídy importují?
- Abyste nemuseli psát celou cestu k třídě pokaždé
- Třídy jsou často uložené v různých složkách a jmenných prostorech (namespaces).
- Místo psaní něčeho jako
\Vendor\Project\Module\Tridastačí napsat jenTrida.
- Aby byl kód čistší a přehlednější
- Když importujete třídy na začátku souboru, hned vidíte, jaké komponenty se používají.
- Aby se předešlo kolizím názvů
- Dvě různé knihovny můžou mít třídu se stejným jménem (např.
Database). Importováním přesusejasně říkáte, kterou přesně chcete použít.
- Dvě různé knihovny můžou mít třídu se stejným jménem (např.
Jak se třídy importují?
Na začátku souboru (hned za <?php) napíšete:
use JmennyProstor\NazevTridy;
Pak můžete v kódu používat jen NazevTridy místo celé cesty.
Příklad:
<?php
use Sunlight\Database\Database;
// Místo:
$query = \Sunlight\Database\Database::query();
// Stačí:
$query = Database::query();
Aliasy tříd (as)
Někdy má třída dlouhý název nebo chcete předejít kolizi názvů. V takovém případě můžete při importu použít alias pomocí as:
<?php
use Psr\Log\LoggerInterface as Logger;
use App\Logger\Logger as Log;
// Teď můžete používat zkrácené názvy:
function writeLog(Logger $logger) {
$logger->info('Log message');
}
$logger = new Log('app');
V prostředí SunLightu nejčastěji narazíte na DB alias pro třídu Sunlight\Database\Database
<?php
use Sunlight\Database\Database as DB;
$query = DB::query('SELECT ...');
Kdy aliasy použít:
- Když máte třídy se stejným názvem z různých jmenných prostorů
- Pro zkrácení dlouhých názvů tříd
- Pro lepší čitelnost kódu
Kde se třídy importují?
- Vždy na začátku souboru (nejlíp hned za
<?php). - Importujete jen to, co v daném souboru skutečně použijete.
-
Pokud potřebujete více tříd ze stejného jmenného prostoru, můžete je napsat pod sebe:
<?pho use Sunlight\Util\Form; use Sunlight\Util\Html;
Jak to funguje uvnitř? (ClassLoader)
PHP nečte všechny třídy naráz, ale načítá je automaticky, až když jsou potřeba – k tomu slouží autoloading (automatické načítání).
- ClassLoader (např. Composer Autoloader) sleduje, které třídy se používají.
- Když narazíte na
new Trida()neboTrida::metoda(), ClassLoader:- Podívá se, jestli je třída už načtená.
- Pokud ne, najde odpovídající soubor a načte ho.
- Díky tomu nemusíte ručně
requireneboincludepro každou třídu zvlášť.
Výhody:
- Kód je rychlejší (načte se jen to, co se skutečně použije).
- Nemusíte řešit pořadí načítání souborů.
- Můžete používat třídy odkudkoli, aniž byste museli řešit složité cesty.