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
25Der 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.
Aufgabe
EinfachLassen 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 eineProduct-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 nichtsetPrice()sollte nur Werte größer als 0 akzeptieren — lehnen Sie Null oder negative Preise absetStock()sollte nur Werte von 0 oder größer akzeptieren — lehnen Sie negative Lagerbestände ab
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 eineProduct-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 vongetInfo()aus. Versuchen Sie dann, den Preis mit dem neuen Preiswert (konvertiert in Float) zu aktualisieren und geben SiegetInfo()erneut aus. Versuchen Sie schließlich, den Lagerbestand auf-5(einen ungültigen Wert) zu setzen und geben SiegetInfo()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
?>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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung