Egen funktion för automatisk laddning av klasser i OOP i PHP
Ofta kan standard automatisk laddning inte passa dig av någon anledning. I så fall kan du skriva din egen automatiska laddning.
För detta måste du skicka din skrivna
callback-funktion som första parameter till funktionen spl_autoload_register.
Denna funktion kommer att anropas
när PHP upptäcker en åtkomst till en
oladdad klass. Namnet på klassen med namnområde
kommer att skickas till denna funktions parameter:
<?php
spl_autoload_register(function($class) {
// variabeln $class kommer att innehålla klassnamnet med namnområde
});
?>
Och funktionens uppgift är att ladda
klassen via require baserat på klassnamnet.
Det betyder att vi inuti denna funktion måste skriva
vår egen regel för att ladda klasser, det vill säga
vår egen namngivningskonvention.
Låt oss skriva ett exempel på en egen automatisk laddning. Låt oss till exempel säga, att sökvägen till klassfilen från webbplatsens rot kommer att vara densamma som namnområdet, men med bevarande av teckenens register.
Det betyder att om vi har en klass Core\Admin\PageController,
ska sökvägen till den vara Core/Admin/PageController.php.
Som du ser, för att omvandla klassnamnet
med dess namnområde behöver du bara byta
omvända snedstreck mot raka snedstreck, och till klassnamnet
lägga till .php. Låt oss göra detta:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Vi kommer dock att få en relativ sökväg till filen (relativt webbplatsens rot). Det är bättre att göra en absolut sökväg, så här:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Det finns ytterligare en nyans. I olika operativsystem
kan sökvägen genom mappar vara med rakt snedstreck
eller med omvänt snedstreck. Låt oss göra vår kod oberoende
av operativsystemet. För att göra detta, istället för
ett rakt snedstreck för att separera sökvägar, kommer vi att använda
konstanten DIRECTORY_SEPARATOR,
som innehåller rätt snedstreck för det operativsystem
i vilket vårt skript för närvarande körs. Som ett resultat får vi följande kod:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testa den automatiska laddningsfunktion jag skapat.
Kom på din egen regel för automatisk laddning och implementera den.