Menu
Coddy logo textTech

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 = 77F

Die 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.

challenge icon

Aufgabe

Einfach

Lassen 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 eine Money-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 Cents
    • getDollars() — 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 USD
    • getEuros() — 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 eine Money-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)

?>
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