Information Hiding
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 41 von 91.
Information Hiding (Geheimnisprinzip) ist das Prinzip hinter der Kapselung – die Idee, dass eine Klasse nur das Notwendige offenlegen und ihre internen Implementierungsdetails verbergen sollte. Während Zugriffsmodifikatoren und Getter/Setter die Werkzeuge sind, ist Information Hiding die Designphilosophie, die bestimmt, wie man sie einsetzt.
Das Ziel ist es, eine klare Abgrenzung zwischen dem zu schaffen, was eine Klasse tut (ihre öffentliche Schnittstelle), und wie sie es tut (ihre interne Implementierung). Diese Trennung bedeutet, dass Sie die interne Funktionsweise ändern können, ohne den Code zu beeinflussen, 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 dies nicht wissen. Sie könnten 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: Information Hiding schützt Ihren Code vor Änderungen. Verbergen Sie Implementierungsdetails, legen Sie nur stabile Schnittstellen offen, und Ihre Klassen werden im Laufe der Zeit einfacher zu warten und zu ändern sein.
Aufgabe
EinfachLassen Sie uns einen Währungsumrechner bauen, der Information Hiding in Aktion demonstriert. Sie erstellen eine Klasse, die Geld intern in einer Währung speichert, aber nahtlos in und aus mehreren Währungen umrechnen kann — ohne dass externer Code jemals erfährt, wie die Daten tatsächlich gespeichert werden.
Sie werden Ihren Code auf zwei Dateien aufteilen:
Money.php— Erstellen Sie eineMoney-Klasse, die intern alle Beträge in Cents (als Ganzzahl) speichert, um Probleme mit der Fließkommapräzision zu vermeiden. Dieses Implementierungsdetail sollte vor den Benutzern der Klasse vollständig verborgen bleiben. Die Klasse sollte Folgendes bereitstellen:- Eine private Eigenschaft zum Speichern des Betrags in Cents
setDollars(float $amount)— akzeptiert einen Dollarbetrag und speichert ihn intern als CentsgetDollars()— gibt den Betrag als Dollar zurück (float, 2 Dezimalstellen)setEuros(float $amount)— akzeptiert Euro und rechnet diese in Cents um, unter Verwendung des Kurses: 1 EUR = 1.10 USDgetEuros()— gibt den in Euro umgerechneten Betrag zurück (float, 2 Dezimalstellen)getInternalValue()— gibt den rohen Cent-Wert (integer) zu Debugging-Zwecken zurück
main.php— Binden Sie die Money-Datei ein. Sie erhalten zwei Eingaben: einen Dollarbetrag und einen Eurobetrag. Erstellen Sie eineMoney-Instanz. Setzen Sie zuerst den Dollarbetrag (in float umgewandelt) und geben Sie drei Zeilen aus: den Dollarwert, das Euro-Äquivalent und den internen Cent-Wert. Setzen Sie dann den Eurobetrag (in float umgewandelt) und geben Sie dieselben drei Werte erneut aus.
Das Schöne an diesem Design ist, dass der externe Code mit vertrauten Dollar- und Eurowerten arbeitet, völlig unwissend darüber, dass intern alles als Cents gespeichert wird. Sie könnten später den internen Speicher auf eine andere Basiswährung oder eine andere Präzisionsstrategie umstellen, und solange die öffentlichen Methoden weiterhin korrekt funktionieren, müsste kein externer Code geändert werden.
Formatieren Sie alle Dollar- und Euro-Ausgaben auf genau 2 Dezimalstellen. Jeder Wert sollte in einer eigenen Zeile ausgegeben werden, was insgesamt sechs Zeilen Ausgabe ergibt.
Spickzettel
Geheimnisprinzip (Information Hiding) ist das Prinzip hinter der Kapselung – es wird nur das Notwendige offengelegt, während interne Implementierungsdetails verborgen bleiben. Dies schafft eine klare Grenze zwischen dem, was eine Klasse tut (öffentliche Schnittstelle), und wie sie es tut (interne Implementierung).
Beispiel für Geheimnisprinzip mit einer Temperature-Klasse:
<?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 = 77F
Die Klasse speichert die Temperatur intern in Celsius, aber die Benutzer müssen dies nicht wissen. Die interne Speicherung könnte auf Fahrenheit oder Kelvin geändert werden, ohne den externen Code zu beeinträchtigen, solange die öffentlichen Methoden weiterhin auf dieselbe Weise funktionieren.
Wichtigste Vorteile: Das Geheimnisprinzip schützt Code vor Änderungen. Durch das Verbergen von Implementierungsdetails und das Offenlegen nur stabiler Schnittstellen werden Klassen im Laufe der Zeit einfacher zu warten und zu modifizieren.
Probier es selbst
<?php
require_once 'Money.php';
// Eingaben lesen
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Eine Money-Instanz erstellen
// TODO: Den Dollarbetrag setzen und ausgeben:
// - Den Dollarwert (2 Dezimalstellen)
// - Den entsprechenden Eurowert (2 Dezimalstellen)
// - Den internen Centwert (Ganzzahl)
// TODO: Den Eurobetrag setzen und ausgeben:
// - Den Dollarwert (2 Dezimalstellen)
// - Den entsprechenden Eurowert (2 Dezimalstellen)
// - Den internen Centwert (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 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