Menu
Coddy logo textTech

Getter und Setter

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

Da Sie nun Zugriffsmodifikatoren verstehen, wie interagieren Sie sicher mit privaten Eigenschaften von außerhalb der Klasse? Die Antwort lautet Getter und Setter – öffentliche Methoden, die einen kontrollierten Zugriff auf private Daten ermöglichen.

Ein Getter ruft den Wert einer Eigenschaft ab, während ein Setter diesen ändert. Dieses Muster ermöglicht es Ihnen, Validierung oder Logik hinzuzufügen, wenn auf Daten zugegriffen wird oder diese geändert werden:

<?php
class User {
    private string $email;
    private int $age;
    
    public function getEmail(): string {
        return $this->email;
    }
    
    public function setEmail(string $email): void {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->email = $email;
        }
    }
    
    public function getAge(): int {
        return $this->age;
    }
    
    public function setAge(int $age): void {
        if ($age >= 0 && $age <= 150) {
            $this->age = $age;
        }
    }
}

$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);

echo $user->getEmail() . "\n";
echo $user->getAge();

Ausgabe:

john@example.com
25

Der Setter validiert das E-Mail-Format und stellt sicher, dass das Alter angemessen ist, bevor die Werte gespeichert werden. Ohne Setter könnte jeder direkt ungültige Daten zuweisen. Sie können auch schreibgeschützte Eigenschaften erstellen, indem Sie nur einen Getter bereitstellen, oder nur beschreibbare Eigenschaften mit nur einem Setter.

Wichtiger Punkt: Getter und Setter geben Ihnen die Kontrolle darüber, wie auf private Daten zugegriffen wird und wie diese geändert werden, was Validierung, Formatierung oder jegliche benutzerdefinierte Logik ermöglicht.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Produktinventarsystem erstellen, das Getter und Setter verwendet, um Produktdaten zu schützen und zu validieren. Sie werden eine Product-Klasse erstellen, die sicherstellt, dass Preise immer positiv sind und Lagerbestände niemals negativ — was demonstriert, wie Setter Geschäftsregeln erzwingen können.

Sie werden Ihren Code in zwei Dateien organisieren:

  • Product.php — Erstellen Sie eine Product-Klasse mit drei privaten Eigenschaften: $name (String), $price (Float) und $stock (Integer). Implementieren Sie Getter und Setter für jede Eigenschaft mit den folgenden Validierungsregeln:
    • setName() sollte nur nicht-leere Strings akzeptieren — wenn der String nach dem Kürzen (trimming) leer ist, aktualisieren Sie die Eigenschaft nicht
    • setPrice() sollte nur Werte größer als 0 akzeptieren — lehnen Sie Null oder negative Preise ab
    • setStock() sollte nur Werte von 0 oder größer akzeptieren — lehnen Sie negative Lagerbestände ab
    Jeder Getter sollte einfach den entsprechenden Eigenschaftswert zurückgeben. Fügen Sie eine öffentliche Methode getInfo() hinzu, die "[name]: $[price] ([stock] in stock)" zurückgibt, wobei der Preis auf 2 Dezimalstellen formatiert ist.
  • main.php — Binden Sie die Product-Datei ein. Sie erhalten vier Eingaben: einen Produktnamen, einen Preis, eine Lagerbestandsmenge und einen neuen Preis zur Aktualisierung. Erstellen Sie eine Product-Instanz und verwenden Sie die Setter, um den ursprünglichen Namen, den Preis (konvertiert in Float) und den Lagerbestand (konvertiert in Integer) zuzuweisen. Geben Sie das Ergebnis von getInfo() aus. Versuchen Sie dann, den Preis mit dem neuen Preiswert (konvertiert in Float) zu aktualisieren und geben Sie getInfo() erneut aus. Versuchen Sie schließlich, den Lagerbestand auf -5 (einen ungültigen Wert) zu setzen und geben Sie getInfo() ein weiteres Mal aus, um zu bestätigen, dass der Lagerbestand nicht geändert wurde.

Ihre Setter fungieren als Gatekeeper — sie validieren eingehende Daten, bevor sie Änderungen an den privaten Eigenschaften zulassen. Wenn ungültige Daten übergeben werden (wie ein negativer Lagerbestand), ignoriert der Setter diese einfach und behält den vorhandenen gültigen Wert bei. Dies ist die Stärke der Kapselung: Ihr Objekt bewahrt seine Integrität, unabhängig davon, was externer Code zu tun versucht.

Spickzettel

Verwenden Sie Getter und Setter, um einen kontrollierten Zugriff auf private Eigenschaften zu ermöglichen. Ein Getter ruft einen Wert ab, während ein Setter ihn mit optionaler Validierung ändert:

<?php
class User {
    private string $email;
    private int $age;
    
    public function getEmail(): string {
        return $this->email;
    }
    
    public function setEmail(string $email): void {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->email = $email;
        }
    }
    
    public function getAge(): int {
        return $this->age;
    }
    
    public function setAge(int $age): void {
        if ($age >= 0 && $age <= 150) {
            $this->age = $age;
        }
    }
}

$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);

echo $user->getEmail(); // john@example.com
echo $user->getAge(); // 25

Setter können Daten validieren, bevor sie gespeichert werden. Wenn die Validierung fehlschlägt, kann der Setter die Aktualisierung ignorieren und den vorhandenen Wert beibehalten. Sie können schreibgeschützte Eigenschaften erstellen, indem Sie nur einen Getter bereitstellen, oder nur-schreibbare Eigenschaften mit nur einem Setter.

Probier es selbst

<?php
require_once 'Product.php';

// Eingaben lesen
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));

// TODO: Eine neue Product-Instanz erstellen

// TODO: Setter verwenden, um den ursprünglichen Namen, Preis (als Float) und Bestand (als Integer) zuzuweisen

// TODO: Das Ergebnis von getInfo() ausgeben

// TODO: Den Preis mit newPrice (als Float) aktualisieren und getInfo() erneut ausgeben

// TODO: Versuchen, den Bestand auf -5 zu setzen (ungültig) und getInfo() ausgeben, um zu bestätigen, dass der Bestand nicht geändert wurde

?>
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