Eigen functie voor het automatisch laden van klassen in OOP in PHP
Vaak kan de standaard autoloader je niet bevallen om welke reden dan ook. In zo'n geval kun je je eigen autoloader schrijven.
Om dit te doen moet je als eerste parameter aan de functie spl_autoload_register
je eigen callback-functie doorgeven.
Deze functie wordt aangeroepen
wanneer PHP een aanroep naar een
niet-geladen klasse detecteert. Aan deze functie
wordt de klassenaam met de namespace doorgegeven:
<?php
spl_autoload_register(function($class) {
// in de variabele $class staat de klassenaam met namespace
});
?>
En de taak van de functie is om op basis van de klassenaam
deze klasse te laden via require.
Dat betekent dat we binnen deze functie
onze eigen regel voor het laden van klassen moeten coderen,
onze eigen naamgevingsconventie.
Laten we een voorbeeld schrijven van een eigen autoloader. Stel bijvoorbeeld dat we afspreken dat het pad naar het klassebestand vanaf de root van de site hetzelfde is als de namespace, maar met behoud van hoofdlettergevoeligheid.
Dat betekent, als we een klasse Core\Admin\PageController hebben,
dan moet het pad ernaar Core/Admin/PageController.php zijn.
Zoals je ziet, voor het transformeren van de klassenaam
met zijn namespace moeten we simpelweg
de backslashes vervangen door forward slashes, en aan de klassenaam
.php toevoegen. Laten we dit doen:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
We krijgen echter een relatief pad naar het bestand (ten opzichte van de root van de site). Het is beter om een absoluut pad te maken, zoals dit:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Er is nog een nuance. In verschillende besturingssystemen
kan het pad met een forward slash
of een backslash zijn. Laten we onze code onafhankelijk maken
van het besturingssysteem. Hiervoor gebruiken we
in plaats van de forward slash voor het scheiden van paden
de constante DIRECTORY_SEPARATOR,
die de juiste slash bevat voor het besturingssysteem
waarop ons script momenteel draait.
Uiteindelijk krijgen we de volgende code:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Test de door mij gemaakte autoload-functie.
Bedenk je eigen regel voor autoloading en implementeer deze.