Menu
Coddy logo textTech

Zugriffsmodifikatoren im Detail

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 39 von 91.

Nachdem du nun die drei Zugriffsmodifikatoren verstanden hast, wollen wir untersuchen, wie sie sich in Vererbungsszenarien verhalten. Die wichtigste Erkenntnis ist, dass protected-Member für Unterklassen zugänglich werden, während private-Member selbst vor Unterklassen verborgen bleiben.

<?php
class Vehicle {
    public $brand;
    protected $engineType;
    private $serialNumber;
    
    public function __construct($brand, $engine, $serial) {
        $this->brand = $brand;
        $this->engineType = $engine;
        $this->serialNumber = $serial;
    }
    
    private function getSerial() {
        return $this->serialNumber;
    }
    
    protected function getEngineInfo() {
        return $this->engineType;
    }
}

class Car extends Vehicle {
    public function getDetails() {
        return $this->brand . " - " . $this->getEngineInfo();
        // $this->serialNumber würde einen Fehler verursachen - private!
        // $this->getSerial() würde ebenfalls fehlschlagen - private method!
    }
}

$car = new Car("Toyota", "V6", "ABC123");
echo $car->getDetails();

Ausgabe:

Toyota - V6

Die Klasse Car kann auf $brand (öffentlich) zugreifen und getEngineInfo() (geschützt) aufrufen, hat aber keinen Zugriff auf $serialNumber oder getSerial(), da diese für Vehicle privat sind. Diese Unterscheidung ermöglicht es dir, einige interne Details mit untergeordneten Klassen zu teilen, während andere vollständig verborgen bleiben.

Wichtiger Punkt: Verwende protected, wenn abgeleitete Klassen Zugriff auf interne Daten oder Methoden benötigen, und private, wenn selbst abgeleitete Klassen bestimmte Implementierungsdetails nicht berühren sollten.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Geräteverwaltungssystem, das untersucht, wie sich Zugriffsmodifikatoren bei Vererbung verhalten. Du erstellst eine Basisklasse Device mit Eigenschaften auf unterschiedlichen Sichtbarkeitsebenen und erweiterst sie anschließend mit einer Klasse Smartphone, die veranschaulicht, auf welche Member Unterklassen zugreifen können und auf welche nicht.

Du organisierst deinen Code über drei Dateien:

  • Device.php: Erstelle eine Klasse Device, die elektronische Geräte mit unterschiedlichen Stufen der Datenvertraulichkeit repräsentiert. Füge Folgendes hinzu:
    • Eine public-Eigenschaft $brand für den Namen des Herstellers
    • Eine protected-Eigenschaft $modelNumber zur internen Identifizierung
    • Eine private-Eigenschaft $manufacturingCode für ausschließlich werkseitig verwendete Daten
    Der Konstruktor soll alle drei Werte akzeptieren. Füge eine private-Methode getManufacturingCode() hinzu, die den Fertigungscode zurückgibt. Füge eine public-Methode getModelInfo() hinzu, die "Model: [modelNumber]" zurückgibt. Füge schließlich eine public-Methode getFullCode() hinzu, die "[brand]-[manufacturingCode]" zurückgibt. Dies veranschaulicht, wie die Klasse selbst auf ihre eigenen privaten Member zugreifen kann.
  • Smartphone.php: Erstelle eine Klasse Smartphone, die Device erweitert. Binde die Device-Datei ein. Der Konstruktor soll brand, modelNumber, manufacturingCode und den Namen eines Betriebssystems akzeptieren. Rufe den Konstruktor der übergeordneten Klasse mit den ersten drei Werten auf und speichere anschließend das Betriebssystem in einer privaten Eigenschaft. Füge eine öffentliche Methode getDeviceDetails() hinzu, die "[brand] [modelNumber] running [os]" zurückgibt. Beachte, dass du direkt auf die öffentliche Eigenschaft $brand und die geschützte Eigenschaft $modelNumber zugreifen kannst, aber nicht direkt auf die private Eigenschaft $manufacturingCode: Stattdessen müsstest du die geerbte öffentliche Methode getFullCode() verwenden.
  • main.php: Binde die Smartphone-Datei ein. Du erhältst vier Eingaben: einen Markennamen, eine Modellnummer, einen Fertigungscode und ein Betriebssystem. Erstelle mit diesen Werten eine Instanz von Smartphone. Gib drei Zeilen aus:
    • Das Ergebnis des Aufrufs von getDeviceDetails()
    • Das Ergebnis des Aufrufs der geerbten Methode getModelInfo()
    • Das Ergebnis des Aufrufs der geerbten Methode getFullCode()

Diese Aufgabe hebt den entscheidenden Unterschied hervor: Deine Klasse Smartphone kann die von Device geerbte geschützte Eigenschaft $modelNumber uneingeschränkt verwenden, aber die private Eigenschaft $manufacturingCode und die Methode getManufacturingCode() bleiben vollständig verborgen: Sie sind nur über die öffentliche Schnittstelle zugänglich, die Device zur Verfügung stellt.

Probier es selbst

<?php
require_once 'Smartphone.php';

// Eingaben lesen
$brand = trim(fgets(STDIN));
$modelNumber = trim(fgets(STDIN));
$manufacturingCode = trim(fgets(STDIN));
$os = trim(fgets(STDIN));

// TODO: Erstelle eine Smartphone-Instanz mit den Eingabewerten

// TODO: Gib das Ergebnis von getDeviceDetails() aus

// TODO: Gib das Ergebnis der geerbten getModelInfo()-Methode aus

// TODO: Gib das Ergebnis der geerbten getFullCode()-Methode aus
?>
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

Übe selbstständig: Online-PHP-Compiler