Egen funktion til automatisk indlæsning af klasser i OOP i PHP
Ofte kan standard automatisk indlæsning ikke passe dig af en eller anden grund. I sådanne tilfælde kan du skrive din egen automatiske indlæsning.
For at gøre dette skal du sende din
skrevne callback-funktion som den første parameter til funktionen spl_autoload_register.
Denne funktion vil blive kaldt,
når PHP opdager adgang til en
ikke-indlæst klasse. Navnet på klassen med navnerum
vil blive sendt til parameteren af denne funktion:
<?php
spl_autoload_register(function($class) {
// variablen $class vil indeholde klassenavnet med navnerum
});
?>
Og funktionens ansvar er at indlæse klassen
via require baseret på klassenavnet.
Det betyder, at vi inde i denne funktion skal skrive
vores egen regel for indlæsning af klasser, altså
vores egen navnekonvention.
Lad os skrive et eksempel på vores egen automatiske indlæsning. Lad os for eksempel sige, at stien til klassefilen fra websitets rod skal være den samme som navnerummet, men med bevaret stor og lille skrift.
Det betyder, at hvis vi har klassen Core\Admin\PageController,
så skal stien til den være Core/Admin/PageController.php.
Som du kan se, for at transformere klassenavnet
med dets navnerum, skal du bare erstatte
omvendte skråstreger med almindelige skråstreger, og tilføje
.php til klassenavnet. Lad os gøre dette:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Vi vil dog ende med en relativ sti til filen (i forhold til websitets rod). Det er bedre at lave en absolut sti, sådan her:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Der er en nuance mere. I forskellige operativsystemer
kan stien gennem mapper være med almindelig skråstreg
eller med omvendt skråstreg. Lad os gøre vores kode uafhængig
af operativsystemet. For at gøre dette, i stedet for
en almindelig skråstreg til at adskille stier, vil vi
bruge konstanten DIRECTORY_SEPARATOR,
som indeholder den korrekte skråstreg for det operativsystem,
som vores script kører på i øjeblikket. Til sidst 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 indlæsningsfunktion, jeg har oprettet.
Find på din egen regel for automatisk indlæsning og implementer den.