Sobes.tech
Junior

Šta su interfejsi u PHP?

sobes.tech АИ

Одговор од АИ

Интерфејс у 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