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
25Der 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.
Aufgabe
EinfachErstellen 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 eineProduct-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 werdensetPrice()soll nur Werte größer als 0 akzeptieren: Null oder negative Preise zurückweisensetStock()soll nur Werte von 0 oder größer akzeptieren: negative Lagerbestandsmengen zurückweisen
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 eineProduct-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 vongetInfo()aus. Versuche anschließend, den Preis mit dem neuen Preiswert (in einen Float konvertiert) zu aktualisieren, und gibgetInfo()erneut aus. Versuche schließlich, den Lagerbestand auf-5(einen ungültigen Wert) zu setzen, und gibgetInfo()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
?>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