Eigene Funktion für das automatische Laden von Klassen in OOP in PHP
Oft kann das Standard-Autoloading Sie aus irgendeinem Grund nicht zufriedenstellen. In In diesem Fall können Sie Ihr eigenes Autoloading schreiben.
Dazu muss der Funktion spl_autoload_register
als ersten Parameter Ihren geschriebenen
Callback-Funktion übergeben werden. Diese Funktion wird aufgerufen,
wenn PHP den Zugriff auf eine
nicht geladene Klasse erkennt. Als Parameter dieser Funktion
wird der Klassenname mit Namensraum übergeben:
<?php
spl_autoload_register(function($class) {
// in der Variable $class befindet sich der Klassenname mit Namensraum
});
?>
Die Aufgabe der Funktion ist es, basierend auf dem Klassennamen
das Laden dieser Klasse via require durchzuführen.
Das heißt, innerhalb dieser Funktion müssen wir
unsere eigene Regel für das Laden von Klassen festlegen, also
unsere eigene Namenskonvention.
Schreiben wir ein Beispiel für ein eigenes Autoloading. Nehmen wir zum Beispiel an, wir legen fest, dass der Pfad zur Klassendatei vom Root-Verzeichnis der Website genauso sein soll wie der Namensraum, aber unter Beibehaltung der Groß-/Kleinschreibung.
Das heißt, wenn wir eine Klasse Core\Admin\PageController haben,
dann sollte der Pfad zu ihr Core/Admin/PageController.php sein.
Wie Sie sehen, muss für die Transformation des Klassennamens
mit seinem Namensraum einfach der
Backslash durch einen Forward Slash ersetzt werden, und an den Klassennamen
muss .php angehängt werden. Machen wir das:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Allerdings erhalten wir so einen relativen Pfad zur Datei (relativ zum Root-Verzeichnis der Website). Besser ist es, einen absoluten Pfad zu erstellen, so:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Es gibt noch einen weiteren Punkt. In verschiedenen Betriebssystemen
kann der Pfad durch die Ordner mit einem Forward Slash
oder einem Backslash getrennt sein. Machen wir unseren Code unabhängig
vom Betriebssystem. Dazu ersetzen wir
den Forward Slash für die Pfadtrennung durch die Konstante DIRECTORY_SEPARATOR,
die den korrekten Slash für das Betriebssystem enthält,
in dem unser Skript gerade läuft. Am Ende erhalten wir folgenden Code:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testen Sie die von mir erstellte Autoload-Funktion.
Denken Sie sich Ihre eigene Autoload-Regel aus und setzen Sie sie um.