Serverseitige Skriptsprache PHP
Namespace, Autolader und Verzeichnis
Namespaces sind praktisch, damit etwa Klassen mit gleichem Namen koexistieren können. Das kann vorkommen, wenn du Module einbindest, die Namen verwenden, die du schon in deiner eigenen Erfindung verwendest oder in anderen eingebundenen Modulen verwendet werden.
Der langen Rede kurzer Sinn: Wenn du Namespaces verwendest, muss der Namespacename im PHP-Script ganz oben stehen.
<?php
declare(strict_types = 1);
namespace
App\Controllers;
use Framework\Controller;
use Framework\Response;
class Home extends
Controller
{
public function index(): Response
{
return
$this->view("Home/index.mvc.php");
}
}
Du darfst den Namespace so nennen, wie Du möchtest, aber Achtung! Den Zusammenhang zum Autolader solltest Du hingegen kennen und in Betracht ziehen, sonst codest Du Dich ins Verderben …
Notabene wird mit use eine Klasse — etwa die Klasse Controller — eingebunden, die in einem anderen Namespace — etwa im Namespace Framework — zu Hause ist und verwendet wird, etwa die Elternklasse Controller, die mit class Home extends Controller eingebunden wird.
Den Zusammenhang zwischen Namespace und Autolader schauen wir uns im nächsten Schritt an …
Autolader
Im Front-Controller index.php steht:
<?php
declare(strict_types = 1);
session_start();
define("ROOT_PATH", dirname(__DIR__));
spl_autoload_register(function
(string $class_name) {
require ROOT_PATH .
"/src/" . str_replace("\\", "/", $class_name) . ".php";
});
Die anonyme Funktion zum Autolader erhält die Variable $class_name, etwa mit dem Inhalt App\Controllers\Home. Sie pflanzt den Root Pfad vorn dran und ändert die Backslashs in Schrägstriche um, damit Windows und Unix zufrieden sind und pflanzt .php hintendran, etwa so:
- nimmt ROOT_PATH
- hängt /src/ dran
- dann nimmt sie den Wert aus der Variable $class_name, ersetzt darin alle \ durch / und hängt das Resultat dran
- und hängt .php dran.
- Das ergibt: ROOT_PATH/src/App/Controllers/Home.php
- und bindet mittels require die Klassendatei ein.
Wenn dein Verzeichnisbaum haargenau so aufgebaut ist und die Verzeichnisnamen, Klassendateinamen und Klassennamen mit Grossbuchstaben beginnen, saust der Ladevorgang schlank und problemlos durch. Der Aufbau der Namespacenamen und Verzeichnisnamen ist gleich, und das musst du verstanden haben. Nicht etwa, weil es so sein muss, sondern weil es so saumässig praktisch wird.
Damit brauchst du haargenau einen einzigen Autolader, der so aussieht, wie oben beschrieben!
Alles, was mit Namespace zu tun hat, ist im Ordner src, deshalb wird src auch in den Pfad aufgenommen und die Namespacenamen entsprechen den Ordnernamen unterhalb src.
Verzeichnis (Auszug)
| Verzeichnis, Datei | Hinweis | Namespace | |||||
| <root> | Wurzelverzeichnis | ||||||
| config | Konfiguration | ||||||
| public | Öffentlich | ||||||
| index.php | Front-Controller | ||||||
| src | Quellprogramme | ||||||
| App | Alle Anwendung | ||||||
| Controllers | Alle Steuerungen | ||||||
| Admin | Steuerungen zur Administration | ||||||
| Users.php | Benutzerverwaltung | App\Controllers\Admin | |||||
| Home.php | Homepagesteuerung | App\Controllers | |||||
| Products.php | Artikelsteuerung | App\Controllers | |||||
| Models | Alle Datenbankzugriffe | ||||||
| Product.php | Artikelzugriff | App\Models | |||||
| Framework | Alle Rahmenprogramme | ||||||
| Controller.php | Elternklasse für Controllers | Framework | |||||
| Model.php | Elternklasse für Models | Framework | |||||
| tmp | Temopräre Dateien | ||||||
| views | Sichten | ||||||
| Home | Sichten zum Controller Home.php | ||||||
| index.mvc.php | Homepage | ||||||
Viel Spass beim Üben …
PS: Möchtest Du mehr zum Thema erfahren? Dann empfehle ich Dir Dave Hollingworth, evtl. interessiert Dich auch der dort angetönte Designansatz, den Link zu ihm findest Du im Kapitel MVC Theorie …
