⊗ppOpNsCA 107 of 107 menu

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.

Nederlands
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wij gebruiken cookies voor de werking van de site, analyse en personalisatie. De verwerking van gegevens gebeurt volgens het Privacybeleid.
alles accepteren aanpassen weigeren