Sobes.tech
Junior

Какви са интерфейсите в PHP?

sobes.tech AI

Отговор от AI

Интерфейсът в PHP е договор, който описва набор от методи (с техните сигнатури), които трябва да реализира клас. Той определя "какво" прави класът, но не и "как".

  • Договор: Клас, реализиращ интерфейса, се ангажира да предостави всички методи, описани в него, със същите имена, параметри и типове връщане.
  • Наследяване на типове: Интерфейсите позволяват да се дефинират типове въз основа на поведение, а не само по йерархия на класовете. Това е полезно за полиморфизъм. Можете да работите с обекти от различни класове, които реализират един интерфейс, сякаш са от един тип.
  • Множествено наследяване на поведение: PHP не поддържа множествено наследяване на класове, но клас може да реализира множество интерфейси. Това позволява на класа да има поведение от няколко договора.
  • Разделяне на отговорностите: Интерфейсите помагат да се раздели определението на поведението от неговата реализация.
<?php

// Определяне на интерфейс
interface Logger
{
    /**
     * Записва съобщение в лог.
     * @param string $message Съобщение за запис.
     */
    public function log(string $message): void;
}

// Клас, реализиращ интерфейса
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);
    }
}

// Друг клас, реализиращ същия интерфейс
class DatabaseLogger implements Logger
{
    private $dbConnection; // Предполагаем обект за връзка с БД

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

    public function log(string $message): void
    {
        // Логика за запис в базата данни
        // ...
        echo "Logging to database: " . $message . PHP_EOL;
    }
}

// Използване на интерфейса с различни реализации
function processData(Logger $logger, string $data): void
{
    // Обработка на данни
    // ...
    $logger->log("Processed data: " . $data);
}

$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Пример за връзка с БД

processData($fileLogger, 'Пример данни 1');
processData($dbLogger, 'Пример данни 2');

Основните разлики спрямо абстрактните класове:

Характеристика Интерфейс Абстрактен клас
Тип членове Само методи (методите трябва да са публични) Методи (публични, защитени), свойства
Реализация на методи Без реализация (само сигнатури) Може да съдържа реализирани методи
Наследяване Клас може да реализира множество интерфейси Клас може да наследи само един абстрактен клас
Конструктор Не Може да има конструктор
Членове с обхват на видимост Само public public, protected