Menu
Coddy logo textTech

Getter und Setter

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

Da du nun Zugriffsmodifikatoren verstehst: Wie kannst du sicher von außerhalb der Klasse mit privaten Eigenschaften interagieren? Die Antwort lautet Getter und Setter – öffentliche Methoden, die kontrollierten Zugriff auf private Daten ermöglichen.

Ein Getter ruft den Wert einer Eigenschaft ab, während ein Setter ihn verändert. Dieses Muster ermöglicht es dir, Validierung oder Logik hinzuzufügen, wenn auf Daten zugegriffen wird oder sie 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 er die Werte speichert. Ohne Setter könnte jeder direkt ungültige Daten zuweisen. Du kannst auch schreibgeschützte Eigenschaften erstellen, indem du nur einen Getter bereitstellst, oder schreibgeschützte Eigenschaften mit nur einem Setter.

Wichtiger Punkt: Getter und Setter geben dir Kontrolle darüber, wie auf private Daten zugegriffen wird und wie sie geändert werden, und ermöglichen Validierung, Formatierung oder eine beliebige benutzerdefinierte Logik.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Produktinventarsystem, das Getter und Setter verwendet, um Produktdaten zu schützen und zu validieren. Du erstellst eine Product-Klasse, die sicherstellt, dass Preise immer positiv und Lagerbestandsmengen niemals negativ sind: So wird gezeigt, wie Setter Geschäftsregeln durchsetzen können.

Du organisierst deinen Code über zwei Dateien:

  • Product.php: Erstelle eine Product-Klasse mit drei privaten Eigenschaften: $name (String), $price (Float) und $stock (Integer). Implementiere Getter und Setter für jede Eigenschaft mit den folgenden Validierungsregeln:
    • setName() soll nur nicht leere Strings akzeptieren; wenn der String nach dem Entfernen von Leerzeichen leer ist, darf die Eigenschaft nicht aktualisiert werden
    • setPrice() soll nur Werte größer als 0 akzeptieren: Null oder negative Preise zurückweisen
    • setStock() soll nur Werte von 0 oder größer akzeptieren: negative Lagerbestandsmengen zurückweisen
    Jeder Getter soll einfach den entsprechenden Eigenschaftswert zurückgeben. Füge eine öffentliche Methode getInfo() hinzu, die "[name]: $[price] ([stock] in stock)" mit dem auf 2 Dezimalstellen formatierten Preis zurückgibt.
  • main.php: Binde die Product-Datei ein. Du erhältst vier Eingaben: einen Produktnamen, einen Preis, eine Lagerbestandsmenge und einen neuen Preis zur Aktualisierung. Erstelle eine Product-Instanz und verwende die Setter, um den anfänglichen Namen, den Preis (in einen Float konvertiert) und den Lagerbestand (in einen Integer konvertiert) zuzuweisen. Gib das Ergebnis von getInfo() aus. Versuche anschließend, den Preis mit dem neuen Preiswert (in einen Float konvertiert) zu aktualisieren, und gib getInfo() erneut aus. Versuche schließlich, den Lagerbestand auf -5 (einen ungültigen Wert) zu setzen, und gib getInfo() noch einmal aus, um zu bestätigen, dass der Lagerbestand nicht geändert wurde.

Deine Setter fungieren als Torwächter. Sie validieren eingehende Daten, bevor sie Änderungen an den privaten Eigenschaften zulassen. Wenn ungültige Daten übergeben werden (zum Beispiel ein negativer Lagerbestand), ignoriert der Setter sie einfach und bewahrt den bestehenden gültigen Wert. Das ist die Stärke der Kapselung: Dein Objekt bewahrt seine Integrität unabhängig davon, was externer Code zu tun versucht.

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: Erstelle eine neue Product-Instanz

// TODO: Verwende Setter, um den initialen name, price (als float) und stock (als integer) zuzuweisen

// TODO: Gib das Ergebnis von getInfo() aus

// TODO: Aktualisiere den price mit newPrice (als float) und gib getInfo() erneut aus

// TODO: Versuche, stock auf -5 (ungültig) zu setzen und gib getInfo() aus, um zu bestätigen, dass stock 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

Übe selbstständig: Online-PHP-Compiler