Menu
Coddy logo textTech

Einführung in Namensräume

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 10 von 91.

Wenn Ihre PHP-Projekte wachsen, werden Sie viele Klassen erstellen. Was passiert, wenn zwei Klassen denselben Namen haben?

Zum Beispiel könnten Sie eine User-Klasse für Ihren Blog und eine weitere User-Klasse für Ihren Shop haben. Namespaces lösen dieses Problem, indem sie Klassen in logische Gruppen organisieren.

Ein Namespace ist wie ein Ordner für Ihre Klassen. Sie deklarieren ihn am Anfang Ihrer PHP-Datei mit dem Schlüsselwort namespace:

<?php
namespace Blog;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Jetzt können Sie 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 Namespaced-Klasse zu verwenden, referenzieren Sie diese mit ihrem vollständigen Pfad unter Verwendung eines Backslashs:

<?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. Sie können auch verschachtelte Namespaces wie App\Models\Blog für eine tiefere Organisation erstellen.

Wichtiger Punkt: Namespaces verhindern Namenskonflikte und halten Ihren Code organisiert. Deklarieren Sie den Namespace immer vor jedem anderen Code in Ihrer Datei (mit Ausnahme von declare-Anweisungen).

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine kleine Anwendung mit Namespaces organisieren, um Namenskonflikte zwischen Klassen mit demselben Namen zu vermeiden.

Stellen Sie sich vor, Sie bauen ein System, das sowohl Fahrzeuge als auch Tiere verwaltet. Beide Bereiche haben eine Entität namens Car — die eine stellt ein tatsächliches Automobil dar, während die andere eine Hauskatze namens "Car" ist (ja, manche Leute nennen ihre Katzen so!).

Sie werden drei Dateien erstellen:

  • Vehicle/Car.php — Definieren Sie eine Car-Klasse im Namespace Vehicle mit einer Eigenschaft public $brand. Der Konstruktor sollte den Markennamen akzeptieren und ihn setzen. Fügen Sie eine Methode describe() hinzu, die "Vehicle: [brand]" zurückgibt.
  • Animal/Car.php — Definieren Sie eine Car-Klasse im Namespace Animal (dies ist eine Katze namens Car!). Sie sollte eine Eigenschaft public $age haben. Der Konstruktor akzeptiert das Alter und setzt es. Fügen Sie eine Methode describe() hinzu, die "Cat named Car, age: [age]" zurückgibt.
  • main.php — Binden Sie beide Klassendateien mit require_once ein. Erstellen Sie ein Objekt aus jedem Namespace unter Verwendung ihrer vollständigen Namespace-Pfade und geben Sie dann das Ergebnis des Aufrufs von describe() für jedes Objekt aus (jeweils in einer eigenen Zeile).

Erstellen Sie in main.php:

  • Ein Vehicle\Car mit der Marke "Toyota"
  • Ein Animal\Car mit dem Alter 3

Denken Sie daran, den Backslash \ zu verwenden, um auf Namespaced-Klassen mit ihrem vollständigen Pfad zu verweisen, wenn Sie Objekte erstellen.

Spickzettel

Namespaces organisieren Klassen in logische Gruppen und verhindern Namenskonflikte, wenn mehrere Klassen denselben Namen teilen.

Deklarieren Sie einen Namespace am Anfang einer PHP-Datei mit dem Schlüsselwort namespace:

<?php
namespace Blog;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Sie können Klassen mit demselben Namen in verschiedenen Namespaces haben:

<?php
namespace Shop;

class User {
    public $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

Um eine Klasse mit Namespace zu verwenden, referenzieren Sie diese mit ihrem vollständigen Pfad unter Verwendung eines Backslashs \:

<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");

echo $blogUser->name . "\n";
echo $shopUser->email . "\n";

Der Backslash trennt Namespace-Ebenen, ähnlich wie Ordnerpfade. Sie können verschachtelte Namespaces wie App\Models\Blog erstellen.

Wichtig: Deklarieren Sie den Namespace immer vor jedem anderen Code in Ihrer Datei (außer declare-Anweisungen).

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"
// Denke daran, den vollständigen Namespace-Pfad mit Backslash zu verwenden

// TODO: Erstelle ein Animal\Car-Objekt mit dem Alter 3
// Denke daran, den vollständigen Namespace-Pfad mit Backslash zu verwenden

// TODO: Gib das Ergebnis von describe() für jedes Objekt aus (jeweils in einer eigenen Zeile)

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung