Junior
Co jsou rozhraní v PHP?
sobes.tech AI
Odpověď od AI
Rozhraní v PHP je smlouva, která popisuje sadu metod (s jejich signaturami), které musí třída implementovat. Určuje "co" třída dělá, ale ne "jak".
- Smlouva: Třída implementující rozhraní se zavazuje poskytnout všechny metody popsané v něm, se stejnými názvy, parametry a typy návratových hodnot.
- Dědičnost typů: Rozhraní umožňují definovat typy na základě chování, nikoli pouze hierarchie tříd. To je užitečné pro polymorfismus. Můžete pracovat s objekty různých tříd, které implementují jedno rozhraní, jako by byly stejného typu.
- Vícenásobná dědičnost chování: PHP nepodporuje vícenásobnou dědičnost tříd, ale třída může implementovat více rozhraní. To umožňuje třídě mít chování z více smluv.
- Oddělení odpovědností: Rozhraní pomáhají oddělit definici chování od jeho implementace.
<?php
// Definice rozhraní
interface Logger
{
/**
* Záznam zprávy do logu.
* @param string $message Zpráva k záznamu.
*/
public function log(string $message): void;
}
// Třída implementující rozhraní
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);
}
}
// Jiná třída implementující to samé rozhraní
class DatabaseLogger implements Logger
{
private $dbConnection; // Předpokládaný objekt připojení k DB
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Logika ukládání do databáze
// ...
echo "Logging to database: " . $message . PHP_EOL;
}
}
// Použití rozhraní s různými implementacemi
function processData(Logger $logger, string $data): void
{
// Zpracování dat
// ...
$logger->log("Processed data: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Příklad připojení k DB
processData($fileLogger, 'Příklad dat 1');
processData($dbLogger, 'Příklad dat 2');
Hlavní rozdíly oproti abstraktním třídám:
| Charakteristika | Rozhraní | Abstraktní třída |
|---|---|---|
| Typ členů | Pouze metody (metody musí být veřejné) | Metody (veřejné, chráněné), vlastnosti |
| Implementace metod | Bez implementace (pouze signatury) | Může obsahovat implementované metody |
| Dědičnost | Třída může implementovat více rozhraní | Třída může dědit pouze z jedné abstraktní třídy |
| Konstruktor | Ne | Může mít konstruktor |
| Členové s viditelností | Pouze public |
public, protected |