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 |