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 |