Junior
PHP-də interfeyslər nədir?
sobes.tech Süni İntellekt
AI-dan cavab
PHP-də interfeys, sinfinin həyata keçirməli olduğu metodların (onların imzaları ilə birlikdə) tərifidir. Bu, "nə" etdiyini müəyyən edir, amma "necə" deyil.
- Müqavilə: Interfeysi həyata keçirən sinf, onun daxilində təsvir olunan bütün metodları, eyni adlar, parametrlər və geri dönüş tipləri ilə təmin etməyə razılaşır.
- Növlərin irsi: Interfeyslər davranışa əsaslanan növləri təyin etməyə imkan verir, yalnız sinif irsi ilə deyil. Bu, çox formallıq üçün faydalıdır. Siz müxtəlif siniflərin obyektləri ilə işləyə bilərsiniz, onlar eyni interfeysi həyata keçirirlər, sanki eyni növdədirlər.
- Çoxlu davranış irsi: PHP çoxlu sinif irsini dəstəkləmir, amma bir sinif çoxlu interfeysləri həyata keçirə bilər. Bu, sinfin müxtəlif müqavilərdən davranışlar əldə etməsinə imkan verir.
- Məsuliyyətlərin ayrılması: Interfeyslər davranışın tərifini onun həyata keçirilməsindən ayırmağa kömək edir.
<?php
// Interfeys tərifi
interface Logger
{
/**
* Log mesajını qeyd edir.
* @param string $message Qeyd ediləcək mesaj.
*/
public function log(string $message): void;
}
// Interfeysi həyata keçirən sinif
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);
}
}
// Eyni interfeisi həyata keçirən başqa sinif
class DatabaseLogger implements Logger
{
private $dbConnection; // Verilənlər bazası əlaqə obyekti qəbul edilir
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Verilənlər bazasına qeyd etmək üçün loqika
// ...
echo "Verilənlər bazasına qeyd edilir: " . $message . PHP_EOL;
}
}
// Müxtəlif həyata keçirmələrlə işləmək üçün interfeys istifadə olunur
function processData(Logger $logger, string $data): void
{
// Məlumatların emalı
// ...
$logger->log("Emal edilmiş məlumatlar: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Verilənlər bazası əlaqəsi üçün mock
processData($fileLogger, 'Nümunə məlumat 1');
processData($dbLogger, 'Nümunə məlumat 2');
Əsas fərqlər abstrakt siniflərlə:
| Xüsusiyyət | Interfeys | Abstrakt sinif |
|---|---|---|
| Üzv növləri | Yalnız metodlar (ictimai olmalı) | Metodlar (ictimai, qorunan), xüsusiyyətlər |
| Metodların həyata keçirilməsi | Heç bir həyata keçirmə (yalnız imzalar) | Həyata keçirilmiş metodlar ola bilər |
| İrsiyyət | Bir sinf çox interfeys həyata keçirə bilər | Bir sinf yalnız bir abstrakt sinifdən irs ala bilər |
| Konstruktor | Yoxdur | Ola bilər |
| Üzvlərin görünüş sahəsi | Yalnız public |
public, protected |