Informationsverbergung
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 41 von 91.
Informationsverbergung ist das Prinzip hinter der Kapselung – die Idee, dass eine class nur das Notwendige offenlegen und ihre internen Implementierungsdetails verbergen sollte. Während Zugriffsmodifikatoren und Getter/Setter die Werkzeuge sind, ist die Informationsverbergung die Designphilosophie, die vorgibt, wie du sie verwendest.
Das Ziel besteht darin, eine klare Grenze zwischen dem zu schaffen, was eine Klasse tut (ihrer öffentlichen Schnittstelle), und der Art und Weise, wie sie es tut (ihrer internen Implementierung). Diese Trennung bedeutet, dass du die interne Funktionsweise ändern kannst, ohne den Code zu beeinträchtigen, der die Klasse verwendet:
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
Ausgabe:
25C = 77FDie Klasse speichert die Temperatur intern in Celsius, aber die Benutzer müssen das nicht wissen. Du könntest die interne Speicherung später auf Fahrenheit oder Kelvin ändern, und solange die öffentlichen Methoden weiterhin auf dieselbe Weise funktionieren, wird kein externer Code beeinträchtigt.
Wichtiger Punkt: Informationsverbergung schützt deinen Code vor Änderungen. Verberge Implementierungsdetails, lege nur stabile Schnittstellen offen, und deine Klassen werden im Laufe der Zeit leichter zu warten und zu ändern.
Aufgabe
EinfachErstellen wir einen Währungsumrechner, der Informationsverbergung in der Praxis demonstriert. Du erstellst eine Klasse, die Geld intern in einer Währung speichert, aber nahtlos die Umrechnung in mehrere Währungen und aus mehreren Währungen ermöglicht, ohne dass externer Code jemals wissen muss, wie die Daten tatsächlich gespeichert werden.
Du organisierst deinen Code über zwei Dateien:
Money.php: Erstelle eineMoney-Klasse, die alle Beträge intern in Cent (als Ganzzahl) speichert, um Probleme mit der Genauigkeit von Gleitkommazahlen zu vermeiden. Dieses Implementierungsdetail sollte für Benutzer der Klasse vollständig verborgen bleiben. Die Klasse sollte Folgendes bereitstellen:- Eine private Eigenschaft zum Speichern des Betrags in Cent
setDollars(float $amount): akzeptiert einen Dollarbetrag und speichert ihn intern als CentgetDollars(): gibt den Betrag als Dollar zurück (Gleitkommazahl mit 2 Dezimalstellen)setEuros(float $amount): akzeptiert Euro und rechnet sie anhand des Kurses 1 EUR = 1.10 USD in Cent umgetEuros(): gibt den in Euro umgerechneten Betrag zurück (Gleitkommazahl mit 2 Dezimalstellen)getInternalValue(): gibt den rohen Centwert (Ganzzahl) zu Debugging-Zwecken zurück
main.php: Binde die Money-Datei ein. Du erhältst zwei Eingaben: einen Dollarbetrag und einen Eurobetrag. Erstelle eineMoney-Instanz. Lege zuerst den Dollarbetrag (in eine Gleitkommazahl umgewandelt) fest und gib drei Zeilen aus: den Dollarwert, das Euroäquivalent und den internen Centwert. Lege anschließend den Eurobetrag (in eine Gleitkommazahl umgewandelt) fest und gib erneut dieselben drei Werte aus.
Der Vorteil dieses Designs besteht darin, dass externer Code mit vertrauten Dollar- und Eurowerten arbeitet, ohne zu wissen, dass intern alles als Cent gespeichert wird. Du könntest später die interne Speicherung auf eine andere Basiswährung oder eine andere Strategie für die Genauigkeit umstellen. Solange die öffentlichen Methoden weiterhin korrekt funktionieren, müsste kein externer Code geändert werden.
Formatiere alle Dollar- und Euroausgaben mit genau 2 Dezimalstellen. Jeder Wert sollte in einer eigenen Zeile ausgegeben werden, sodass insgesamt sechs Ausgabezeilen entstehen.
Probier es selbst
<?php
require_once 'Money.php';
// Eingaben lesen
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Erstelle eine Money-Instanz
// TODO: Setze den Dollarbetrag und gib aus:
// - Den Dollarwert (2 Nachkommastellen)
// - Das Euro-Äquivalent (2 Nachkommastellen)
// - Den internen Cent-Wert (Ganzzahl)
// TODO: Setze den Eurobetrag und gib aus:
// - Den Dollarwert (2 Nachkommastellen)
// - Das Euro-Äquivalent (2 Nachkommastellen)
// - Den internen Cent-Wert (Ganzzahl)
?>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