Junior
Čo sú rozhrania v PHP?
sobes.tech AI
Odpoveď od AI
Rozhranie v PHP je zmluva, ktorá opisuje sadu metód (s ich signatúrami), ktoré musí implementovať trieda. Určuje "čo" robí trieda, ale nie "ako".
- Zmluva: Trieda, ktorá implementuje rozhranie, sa zaväzuje poskytnúť všetky metódy opísané v ňom, so rovnakými názvami, parametrami a typmi návratových hodnôt.
- Dedičnosť typov: Rozhrania umožňujú definovať typy na základe správania, nie len hierarchie tried. To je užitočné pre polymorfizmus. Môžete pracovať s objektmi rôznych tried, ktoré implementujú jedno rozhranie, ako keby boli rovnakého typu.
- Viacnásobná dedičnosť správania: PHP nepodporuje viacnásobnú dedičnosť tried, ale trieda môže implementovať viac rozhraní. To umožňuje triede mať správanie z viacerých zmlúv.
- Oddelenie zodpovedností: Rozhrania pomáhajú oddeliť definíciu správania od jeho implementácie.
<?php
// Definícia rozhrania
interface Logger
{
/**
* Záznam správy do logu.
* @param string $message Správa na záznam.
*/
public function log(string $message): void;
}
// Trieda implementujúca rozhranie
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);
}
}
// Iná trieda, ktorá implementuje to isté rozhranie
class DatabaseLogger implements Logger
{
private $dbConnection; // Predpokladaný objekt pripojenia k DB
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Logika ukladania do databázy
// ...
echo "Logging to database: " . $message . PHP_EOL;
}
}
// Použitie rozhrania s rôznymi implementáciami
function processData(Logger $logger, string $data): void
{
// Spracovanie dát
// ...
$logger->log("Processed data: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Príklad pripojenia k DB
processData($fileLogger, 'Príklad dát 1');
processData($dbLogger, 'Príklad dát 2');
Hlavné rozdiely oproti abstraktným triedam:
| Charakteristika | Rozhranie | Abstraktná trieda |
|---|---|---|
| Typ členov | Iba metódy (metódy musia byť verejné) | Metódy (verejné, chránené), vlastnosti |
| Implementácia metód | Bez implementácie (len signatúry) | Môže obsahovať implementované metódy |
| Dedičnosť | Trieda môže implementovať viac rozhraní | Trieda môže dediť iba z jednej abstraktnej triedy |
| Konštruktor | Nie | Môže mať konštruktor |
| Členovia s viditeľnosťou | Iba public |
public, protected |