Egen funksjon for automatisk lasting av klasser i OOP i PHP
Ofte kan standard automatisk innlasting ikke passe deg av en eller annen grunn. I slike tilfeller kan du skrive din egen automatiske innlastingsfunksjon.
For å gjøre dette må du sende din egen
callback-funksjon som første parameter til funksjonen
spl_autoload_register.
Denne funksjonen vil bli kalt opp
når PHP oppdager tilgang til en
ulastet klasse. Navnet på klassen med navnerom
vil bli sendt som parameter til denne funksjonen:
<?php
spl_autoload_register(function($class) {
// i variabelen $class vil navnet på klassen med navnerom være
});
?>
Og funksjonens oppgave er å laste inn denne klassen
via require basert på klassens navn.
Det vil si at inni denne funksjonen må vi skrive
vår egen regel for lasting av klasser, det vil si
vår egen navnekonvensjon.
La oss skrive et eksempel på vår egen automatiske innlastingsfunksjon. La oss for eksempel si at vi bestemmer at banen til klassens fil fra nettstedets rot skal være den samme som navnerommet, men med store og små bokstaver beholdt.
Det vil si, hvis vi har klassen Core\Admin\PageController,
så skal banen til den være Core/Admin/PageController.php.
Som du ser, for å transformere klassens navn
med dens navnerom, trenger du bare å bytte
omvendte skråstreker med vanlige skråstreker, og til klassens navn
legge til .php. La oss gjøre dette:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Imidlertid vil vi få en relativ bane til filen (i forhold til nettstedets rot). Det er bedre å lage en absolutt bane, slik:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Det er også en nyanse. I forskjellige operativsystemer
kan banen gjennom mapper ha vanlig skråstrek
eller omvendt skråstrek. La oss gjøre koden vår uavhengig
av operativsystem. For å gjøre dette, i stedet for
vanlig skråstrek for å skille baner, bruker vi
konstanten DIRECTORY_SEPARATOR,
som inneholder riktig skråstrek for det operativsystemet
som skriptet vårt kjører på for øyeblikket. Til slutt får vi følgende kode:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Test den automatiske innlastingsfunksjonen jeg har laget.
Kom på din egen regel for automatisk innlasting og implementer den.