Einführung in Namespaces
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 10 von 91.
Wenn deine PHP-Projekte wachsen, wirst du viele Klassen erstellen. Was passiert, wenn zwei Klassen denselben Namen haben?
Zum Beispiel könntest du eine User-Klasse für deinen Blog und eine weitere User-Klasse für deinen Shop haben. Namespaces lösen dieses Problem, indem sie Klassen in logische Gruppen organisieren.
Ein Namespace ist wie ein Ordner für deine Klassen. Du deklarierst ihn am Anfang deiner PHP-Datei mit dem Schlüsselwort namespace:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Jetzt kannst du eine weitere User-Klasse in einem anderen Namespace haben:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
Um eine Klasse mit Namespace zu verwenden, verweist du mit einem umgekehrten Schrägstrich auf ihren vollständigen Pfad:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
Ausgabe:
Alice
alice@example.com
Der Backslash \ trennt Namespace-Ebenen, ähnlich wie Schrägstriche Ordner in einem Dateipfad trennen. Du kannst auch verschachtelte Namespaces wie App\Models\Blog erstellen, um eine tiefere Organisation zu ermöglichen.
Wichtiger Punkt: Namespaces verhindern Namenskonflikte und halten deinen Code organisiert. Deklariere den Namespace immer vor jedem anderen Code in deiner Datei (außer bei declare-Anweisungen).
Aufgabe
EinfachOrganisieren wir eine kleine Anwendung mithilfe von Namespaces, um Namenskonflikte zwischen Klassen mit demselben Namen zu verhindern.
Stell dir vor, du entwickelst ein System, das sowohl Fahrzeuge als auch Tiere verarbeitet. In beiden Bereichen gibt es eine Entität namens Car: Die eine stellt ein tatsächliches Auto dar, während die andere eine Hauskatze namens „Car“ ist (ja, manche Menschen nennen ihre Katzen tatsächlich so!).
Du wirst drei Dateien erstellen:
Vehicle/Car.php: Definiere eineCar-Klasse imVehicle-Namespace mit einer Eigenschaftpublic $brand. Der Konstruktor soll den Markennamen akzeptieren und ihn setzen. Füge einedescribe()-Methode hinzu, die"Vehicle: [brand]"zurückgibt.Animal/Car.php: Definiere eineCar-Klasse imAnimal-Namespace (dies ist eine Katze namens Car!). Sie soll eine Eigenschaftpublic $agebesitzen. Der Konstruktor akzeptiert das Alter und setzt es. Füge einedescribe()-Methode hinzu, die"Cat named Car, age: [age]"zurückgibt.main.php: Binde beide Klassendateien mitrequire_onceein. Erstelle aus jedem Namespace ein Objekt mithilfe der vollständigen Namespace-Pfade und gib anschließend das Ergebnis des Aufrufs vondescribe()für jedes Objekt aus (jeweils in einer eigenen Zeile).
Erstelle in main.php:
- Ein
Vehicle\Car-Objekt mit der Marke"Toyota" - Ein
Animal\Car-Objekt mit dem Alter3
Denke daran, den Backslash \ zu verwenden, um beim Erstellen von Objekten auf Klassen in Namespaces über ihren vollständigen Pfad zu verweisen.
Probier es selbst
<?php
// Die Klassendateien einbinden
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: Erstelle ein Vehicle\Car-Objekt mit der Marke "Toyota"
// Denk daran, den vollständigen Namespace-Pfad mit Backslash zu verwenden
// TODO: Erstelle ein Animal\Car-Objekt mit Alter 3
// Denk daran, den vollständigen Namespace-Pfad mit Backslash zu verwenden
// TODO: Gib das Ergebnis von describe() für jedes Objekt aus (jedes in einer eigenen Zeile)
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler