Sobes.tech
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