Junior
Wat zijn interfaces in PHP?
sobes.tech AI
Antwoord van AI
In PHP is een interface een contract dat een set methoden (met hun handtekeningen) beschrijft die een klasse moet implementeren. Het bepaalt "wat" de klasse doet, maar niet "hoe".
- Contract: De klasse die de interface implementeert, verplicht zich alle in de interface beschreven methoden te bieden, met dezelfde namen, parameters en return types.
- Type-erfenis: Interfaces maken het mogelijk om types te definiëren op basis van gedrag, niet alleen op basis van klassehiërarchie. Dit is handig voor polymorfisme. Je kunt werken met objecten van verschillende klassen die dezelfde interface implementeren, alsof ze van hetzelfde type zijn.
- Meervoudige gedrag-erfenis: PHP ondersteunt geen meervoudige klasse-erfenis, maar een klasse kan meerdere interfaces implementeren. Dit stelt een klasse in staat om gedrag van meerdere contracten te hebben.
- Verantwoordelijkheden scheiden: Interfaces helpen bij het scheiden van de definitie van gedrag en de implementatie ervan.
<?php
// Definities van de interface
interface Logger
{
/**
* Logt een bericht.
* @param string $message Bericht om te loggen.
*/
public function log(string $message): void;
}
// Klasse die de interface implementeert
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);
}
}
// Een andere klasse die dezelfde interface implementeert
class DatabaseLogger implements Logger
{
private $dbConnection; // Er wordt een databaseverbinding object aangenomen
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Logica voor opslaan in database
// ...
echo "Logging naar database: " . $message . PHP_EOL;
}
}
// Gebruik van de interface om met verschillende implementaties te werken
function processData(Logger $logger, string $data): void
{
// Gegevens verwerken
// ...
$logger->log("Verwerkte gegevens: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Mock voor databaseverbinding
processData($fileLogger, 'Voorbeeldgegevens 1');
processData($dbLogger, 'Voorbeeldgegevens 2');
Belangrijkste verschillen met abstracte klassen:
| Kenmerk | Interface | Abstracte klasse |
|---|---|---|
| Lidtypen | Alleen methoden (moeten openbaar zijn) | Methoden (openbaar, beschermd), eigenschappen |
| Implementatie van methoden | Geen implementatie (alleen handtekeningen) | Kan geïmplementeerde methoden bevatten |
| Erfenis | Een klasse kan meerdere interfaces implementeren | Een klasse kan slechts van één abstracte klasse erven |
| Constructor | Niet aanwezig | Kan een constructor hebben |
| Leden met zichtbaarheid | Alleen public |
public, protected |