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