Sobes.tech
Junior

Kas yra sąsajos PHP?

sobes.tech AI

Atsakymas iš AI

PHP sąsaja yra sutartis, aprašanti metodų rinkinį (su jų parašais), kuriuos turi įgyvendinti klasė. Ji apibrėžia "ką" klasė daro, bet ne "kaip".

  • Sutartis: Klasė, įgyvendinanti sąsają, įsipareigoja pateikti visus šioje sąsajoje aprašytus metodus su tais pačiais pavadinimais, parametrais ir grąžinimo tipais.
  • Tipų paveldėjimas: Sąsajos leidžia apibrėžti tipus pagal elgesį, o ne tik klasės hierarchiją. Tai naudinga polimorfizmui. Galite dirbti su skirtingų klasių objektais, kurie įgyvendina vieną sąsają, tarsi jie būtų to paties tipo.
  • Daugkartinis elgesio paveldėjimas: PHP nepalaiko daugybinio klasių paveldėjimo, bet klasė gali įgyvendinti kelias sąsajas. Tai leidžia klasei turėti elgesį iš kelių sutarčių.
  • Atsakomybės atskyrimas: Sąsajos padeda atskirti elgesio apibrėžimą nuo jo įgyvendinimo.
<?php

// Sąsajos apibrėžimas
interface Logger
{
    /**
     * Užrašo žinutę į žurnalą.
     * @param string $message Žinutė įrašymui.
     */
    public function log(string $message): void;
}

// Klasė, įgyvendinanti sąsają
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);
    }
}

// Kita klasė, įgyvendinanti tą patį sąsają
class DatabaseLogger implements Logger
{
    private $dbConnection; // Tikėtinas ryšio objektas

    public function __construct($dbConnection)
    {
        $this->dbConnection = $dbConnection;
    }

    public function log(string $message): void
    {
        // Logika įrašyti į duomenų bazę
        // ...
        echo "Logging to database: " . $message . PHP_EOL;
    }
}

// Sąsajos naudojimas su skirtingomis įgyvendinimais
function processData(Logger $logger, string $data): void
{
    // Duomenų apdorojimas
    // ...
    $logger->log("Processed data: " . $data);
}

$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Pavyzdys, kaip jungtis prie duomenų bazės

processData($fileLogger, 'Pavyzdiniai duomenys 1');
processData($dbLogger, 'Pavyzdiniai duomenys 2');

Pagrindiniai skirtumai nuo abstrakčių klasių:

Savybė Sąsaja Abstrakti klasė
Nariai Tik metodai (metodai turi būti vieši) Metodai (vieši, apsaugoti), savybės
Metodų įgyvendinimas Be įgyvendinimo (tik parašai) Gali turėti įgyvendintus metodus
Paveldėjimas Klasė gali įgyvendinti kelias sąsajas Klasė gali paveldėti tik vieną abstrakčią klasę
Konstruktorius Ne Gali turėti konstruktorių
Narių matomumas Tik public public, protected