Junior
Was sind Schnittstellen in PHP?
sobes.tech KI
Antwort von AI
Die Schnittstelle in PHP ist ein Vertrag, der eine Reihe von Methoden (mit ihren Signaturen) beschreibt, die eine Klasse implementieren muss. Sie legt fest, "was" die Klasse tut, aber nicht "wie".
- Vertrag: Die Klasse, die die Schnittstelle implementiert, verpflichtet sich, alle in ihr beschriebenen Methoden mit den gleichen Namen, Parametern und Rückgabetypen bereitzustellen.
- Typenvererbung: Schnittstellen erlauben es, Typen basierend auf Verhalten zu definieren, nicht nur auf Klassenhierarchien. Das ist nützlich für Polymorphismus. Man kann mit Objekten verschiedener Klassen arbeiten, die eine gleiche Schnittstelle implementieren, als wären sie vom gleichen Typ.
- Mehrfachvererbung von Verhalten: PHP unterstützt keine Mehrfachvererbung von Klassen, aber eine Klasse kann mehrere Schnittstellen implementieren. Das ermöglicht einer Klasse, Verhalten aus mehreren Verträgen zu haben.
- Aufgabentrennung: Schnittstellen helfen, die Definition des Verhaltens von seiner Implementierung zu trennen.
<?php
// Schnittstellen-Definition
interface Logger
{
/**
* Schreibt eine Log-Nachricht.
* @param string $message Nachricht zum Schreiben.
*/
public function log(string $message): void;
}
// Klasse, die die Schnittstelle implementiert
class FileLogger implements Logger
{
private string $filePath;
public function __construct(string $filePath)
{
$this->filePath = $filePath;
}
public function log(string $message): void
{
file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
}
}
// Eine andere Klasse, die die gleiche Schnittstelle implementiert
class DatabaseLogger implements Logger
{
private $dbConnection; // Es wird ein Datenbankverbindungsobjekt angenommen
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Logik zum Speichern in der Datenbank
// ...
echo "In Datenbank protokollieren: " . $message . PHP_EOL;
}
}
// Verwendung der Schnittstelle, um mit verschiedenen Implementierungen zu arbeiten
function processData(Logger $logger, string $data): void
{
// Datenverarbeitung
// ...
$logger->log("Verarbeitete Daten: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Mock für Datenbankverbindung
processData($fileLogger, 'Beispieldaten 1');
processData($dbLogger, 'Beispieldaten 2');
Hauptunterschiede zu abstrakten Klassen:
| Merkmal | Schnittstelle | Abstrakte Klasse |
|---|---|---|
| Member-Typen | Nur Methoden (müssen öffentlich sein) | Methoden (öffentlich, geschützt), Eigenschaften |
| Methodenimplementierung | Keine Implementierung (nur Signaturen) | Kann implementierte Methoden enthalten |
| Vererbung | Eine Klasse kann mehrere Schnittstellen implementieren | Eine Klasse kann nur von einer abstrakten Klasse erben |
| Konstruktor | Nicht vorhanden | Kann einen Konstruktor haben |
| Sichtbarkeit der Mitglieder | Nur public |
public, protected |