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