Sobes.tech
Junior

Mis on liidesed PHP-s?

sobes.tech AI

Vastus AI-lt

PHP-liides on leping, mis kirjeldab meetodite kogumi (ko signatuuridega), mida klass peab rakendama. See määratleb "mida" klass teeb, kuid mitte "kuidas".

  • Leping: Klass, mis rakendab liidest, kohustub pakkuma kõiki selles kirjeldatud meetodeid sama nime, parameetrite ja tagastustüüpidega.
  • Tüüpide pärimine: Liidesed võimaldavad määrata tüüpe käitumise põhjal, mitte ainult klasside hierarhia kaudu. See on kasulik polümorfismis. Saate töötada erinevate klasside objektidega, mis rakendavad ühte liidest, nagu nad oleksid sama tüüpi.
  • Mitme käitumise pärimine: PHP ei toeta mitut pärandit klassidele, kuid klass võib rakendada mitut liidest. See võimaldab klassil omada käitumist mitmest lepingust.
  • Vastutuse jagamine: Liidesed aitavad jagada käitumise määratlemist selle rakendusest.
<?php

// Liidese määratlus
interface Logger
{
    /**
     * Kirjutab logi sõnumi.
     * @param string $message Sõnum kirjutamiseks.
     */
    public function log(string $message): void;
}

// Klass, mis rakendab liidest
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);
    }
}

// Teine klass, mis rakendab sama liidest
class DatabaseLogger implements Logger
{
    private $dbConnection; // Eeldatakse, et see on ühendusobjekt andmebaasiga

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

    public function log(string $message): void
    {
        // Logika andmebaasi salvestamiseks
        // ...
        echo "Logimine andmebaasi: " . $message . PHP_EOL;
    }
}

// Liidese kasutamine erinevate rakendustega
function processData(Logger $logger, string $data): void
{
    // Andmete töötlemine
    // ...
    $logger->log("Töödeldud andmed: " . $data);
}

$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Näidissõnum ühendusest andmebaasiga

processData($fileLogger, 'Näidisandmed 1');
processData($dbLogger, 'Näidisandmed 2');

Peamised erinevused abstraktsete klasside suhtes:

Omadus Liides Abstraktne klass
Liik liikmetest Ainult meetodid (peavad olema avalikud) Meetodid (avalikud, kaitstud), omadused
Meetodite rakendamine Ei ole rakendust (ainult signatuurid) Võib sisaldada rakendatud meetodeid
Pärimine Klass võib rakendada mitut liidest Klass võib pärida ainult ühe abstraktse klassi
Konstruktor Ei ole Võib omada konstruktorit
Liikmed nähtavus Ainult public public, protected